Например, в этой строке кода, которую я написал, print
и puts
привести к другим результатам.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Например, в этой строке кода, которую я написал, print
и puts
привести к другим результатам.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Ответы:
puts
добавляет новую строку в конец каждого аргумента, если его еще нет.
print
не добавляет новую строку.
Например:
puts [[1,2,3], [4,5,nil]]
Вернется:
1 2 3 4 5
Принимая во внимание, print [[1,2,3], [4,5,nil]]
что вернется:
[[1,2,3], [4,5, ноль]]
Обратите внимание, что put не выводит значение nil, а print -.
Большая разница, если вы отображаете массивы. Особенно те, с NIL. Например:
print [nil, 1, 2]
дает
[nil, 1, 2]
но
puts [nil, 1, 2]
дает
1
2
Обратите внимание, что ни один элемент не отображается (просто пустая строка) и каждый элемент находится на отдельной строке.
nil
print
выводит каждый аргумент, затем $,
, до $stdout
, затем $\
. Это эквивалентноargs.join($,) + $\
puts
устанавливает оба параметра $,
и $\
\ n, а затем делает то же самое, что и print
. Главное отличие в том, что каждый аргумент представляет собой новую строку с puts
.
Вы можете require 'english'
получить доступ к этим глобальным переменным с понятными именами .
english
lib
Документы API дают несколько полезных советов:
print() → nil
print(obj, ...) → nil
Записывает данный объект (ы) в ios . Возвращает
nil
.Поток должен быть открыт для записи. Каждый данный объект, который не является строкой, будет преобразован путем вызова его
to_s
метода. При вызове без аргументов печатает содержимое$_
.Если разделитель выходного поля (
$,
) отсутствуетnil
, он вставляется между объектами. Если разделитель выходной записи ($\
) отсутствуетnil
, он добавляется к выводу....
puts(obj, ...) → nil
Записывает данный объект (ы) в ios . Записывает новую строку после любой, которая еще не заканчивается последовательностью новой строки. Возвращает
nil
.Поток должен быть открыт для записи. При вызове с аргументом массива записывает каждый элемент в новую строку. Каждый данный объект, который не является строкой или массивом, будет преобразован путем вызова его
to_s
метода. Если вызывается без аргументов, выводится одна новая строка.
Немного поэкспериментировав с пунктами, приведенными выше, различия кажутся:
Вызывается с несколькими аргументами, print
разделяет их «разделителем выходного поля» $,
(который по умолчанию не имеет значения), а puts
разделяет их переводом строки. puts
также ставит новую строку после последнего аргумента, пока print
нет.
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
автоматически распаковывает массивы, пока print
не:
2.1.3: 001> распечатать [1, [2, 3]], [4] [1, [2, 3]] [4] => ноль 2.1.3: 002> ставит [1, [2, 3]], [4] 1 2 3 4 => ноль
print
без аргументов печатает $_
(последнее, что прочитано gets
), а puts
печатает новую строку:
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
записывает разделитель выходной записи $\
после того, что он печатает, puts
игнорируя эту переменную:
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
Вызовите to_s
каждый аргумент и добавьте новую строку в каждую строку, если она не заканчивается новой строкой.
print
просто выведите каждый аргумент, вызвав их to_s
.
например
puts "one two"
:
one two
{новая линия}
puts "one two\n"
:
one two
{новая строка} #puts не добавит новую строку в результат, так как строка заканчивается новой строкой
print "one two"
:
one two
print "one two\n"
:
one two
{новая линия}
И есть еще один способ вывода: p
Для каждого объекта непосредственно записывает obj.inspect, за которым следует новая строка в стандартный вывод программы.
Это полезно для вывода отладочного сообщения.
p "aa\n\t"
:aa\n\t
Если вы хотите вывести массив внутри строки используя puts
, вы получите тот же результат, что и при использовании print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Но если нет строки в кавычках, тогда да. Единственная разница между новой строкой, когда мы используем puts
.
printf
вместо puts
кода в вашем примере даст тот же результат, но на самом деле это не так. puts
Вариант добавляет символ новой строки в конце в то время как printf
один не делает, так же , как случай , когда нет никакого массива интерполированного в строку. (Обязательно, так как интерполяция происходит при оценке строкового литерала.)