Ví dụ trong dòng mã này tôi đã viết print
và puts
tạo ra các kết quả khác nhau.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Ví dụ trong dòng mã này tôi đã viết print
và puts
tạo ra các kết quả khác nhau.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Câu trả lời:
puts
thêm một dòng mới vào cuối mỗi đối số nếu chưa có một đối số.
print
không thêm một dòng mới.
Ví dụ:
puts [[1,2,3], [4,5,nil]]
Sẽ trở lại:
1 2 3 4 5
Trong khi đó print [[1,2,3], [4,5,nil]]
sẽ trở lại:
[[1,2,3], [4,5, không]]
Lưu ý cách đặt không xuất giá trị nil trong khi in.
Một sự khác biệt lớn là nếu bạn đang hiển thị mảng. Đặc biệt là những người có NIL. Ví dụ:
print [nil, 1, 2]
cho
[nil, 1, 2]
nhưng
puts [nil, 1, 2]
cho
1
2
Lưu ý, không có mục nào xuất hiện (chỉ là một dòng trống) và mỗi mục trên một dòng khác nhau.
nil
print
xuất ra từng đối số, theo sau $,
, đến $stdout
, theo sau $\
. Nó tương đương vớiargs.join($,) + $\
puts
đặt cả hai $,
và $\
thành "\ n" và sau đó thực hiện tương tự như print
. Sự khác biệt chính là mỗi đối số là một dòng mới puts
.
Bạn có thể require 'english'
truy cập các biến toàn cục đó bằng các tên thân thiện với người dùng .
english
lib
Các tài liệu API đưa ra một số gợi ý hay:
print() → nil
print(obj, ...) → nil
Viết (các) đối tượng đã cho vào ios . Trả về
nil
.Các luồng phải được mở để viết. Mỗi đối tượng đã cho không phải là một chuỗi sẽ được chuyển đổi bằng cách gọi
to_s
phương thức của nó . Khi được gọi mà không có đối số, in nội dung của$_
.Nếu dấu phân cách trường đầu ra (
$,
) thì khôngnil
, nó được chèn giữa các đối tượng. Nếu dấu phân cách bản ghi đầu ra ($\
) thì khôngnil
, nó được gắn vào đầu ra....
puts(obj, ...) → nil
Viết (các) đối tượng đã cho vào ios . Viết một dòng mới sau bất kỳ dòng nào chưa kết thúc bằng một chuỗi dòng mới. Trả về
nil
.Các luồng phải được mở để viết. Nếu được gọi với một đối số mảng, hãy viết từng phần tử trên một dòng mới. Mỗi đối tượng đã cho không phải là một chuỗi hoặc mảng sẽ được chuyển đổi bằng cách gọi
to_s
phương thức của nó . Nếu được gọi mà không có đối số, xuất ra một dòng mới.
Thử nghiệm một chút với các điểm nêu trên, sự khác biệt dường như là:
Được gọi với nhiều đối số, print
phân tách chúng bằng 'dấu tách trường đầu ra' $,
(mặc định là không có gì) trong khi puts
phân tách chúng bằng các dòng mới. puts
cũng đặt một dòng mới sau khi đối số cuối cùng, trong khi print
không.
2.1.3 :001 > print 'hello', 'world'
helloworld => nil
2.1.3 :002 > puts 'hello', 'world'
hello
world
=> nil
2.1.3 :003 > $, = 'fanodd'
=> "fanodd"
2.1.3 :004 > print 'hello', 'world'
hellofanoddworld => nil
2.1.3 :005 > puts 'hello', 'world'
hello
world
=> nil
puts
tự động giải nén các mảng, trong khi print
không:
2.1.3: 001> in [1, [2, 3]], [4] [1, [2, 3]] [4] => không 2.1.3: 002> đặt [1, [2, 3]], [4] 1 2 3 4 => không
print
không có đối số được in $_
(điều cuối cùng được đọc bởi gets
), trong khi puts
in một dòng mới:
2.1.3 :001 > gets
hello world
=> "hello world\n"
2.1.3 :002 > puts
=> nil
2.1.3 :003 > print
hello world
=> nil
print
ghi dấu phân tách bản ghi đầu ra $\
sau bất cứ thứ gì nó in, trong khi puts
bỏ qua biến này:
mark@lunchbox:~$ irb
2.1.3 :001 > $\ = 'MOOOOOOO!'
=> "MOOOOOOO!"
2.1.3 :002 > puts "Oink! Baa! Cluck! "
Oink! Baa! Cluck!
=> nil
2.1.3 :003 > print "Oink! Baa! Cluck! "
Oink! Baa! Cluck! MOOOOOOO! => nil
puts
gọi to_s
từng đối số và thêm một dòng mới vào mỗi chuỗi, nếu nó không kết thúc bằng dòng mới.
print
chỉ cần xuất từng đối số bằng cách gọi chúng to_s
.
ví dụ
puts "one two"
::
one two
{dòng mới}
puts "one two\n"
:
one two
{dòng mới} #puts sẽ không thêm dòng mới vào kết quả, vì chuỗi kết thúc bằng một dòng mới
print "one two"
:
one two
print "one two\n"
:
one two
{dòng mới}
Và có một cách khác để xuất ra: p
Đối với mỗi đối tượng, trực tiếp viết obj.inspect theo sau là một dòng mới đến đầu ra tiêu chuẩn của chương trình.
Nó rất hữu ích để xuất thông báo gỡ lỗi.
p "aa\n\t"
:aa\n\t
Nếu bạn muốn xuất mảng trong chuỗi bằng cách sử dụng puts
, bạn sẽ nhận được kết quả tương tự như khi bạn đang sử dụng print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Nhưng nếu không rút một chuỗi trích dẫn thì có. Sự khác biệt duy nhất là giữa dòng mới khi chúng tôi sử dụng puts
.
printf
thay vì puts
trong mã ví dụ của bạn sẽ cho kết quả tương tự, nhưng thực tế thì không. Các puts
biến thể bổ sung thêm một dòng mới vào cuối trong khi printf
một không, giống như trường hợp không có mảng nội suy vào chuỗi. (Nhất thiết phải như vậy, vì phép nội suy xảy ra khi đánh giá chuỗi ký tự.)