Собственно, перевод строки после каждого аргумента. Это ключевой момент, который не ясен из документации по Ruby (поскольку в примере только 1 аргумент).
cdunn2001
3
Есть еще одна вещь ... расширить класс массива и переопределить метод to_s. Put не использует новые to_s для объекта вашего нового класса, в то время как print делает
kapv89
1
при использовании irb 0.9.5 put ("a") и put ("a \ n") имеют одинаковые выходные данные в REPL.
Маркус Юний Брут
@ kapv89 Это не правда: я только что попробовал, и оба помещают электронную печать, используя метод to_s. Только р не использует его.
collimarco
6
@ Фронкер, это всего лишь один аргумент. Компилятор объединяет смежные строки.
cdunn2001
61
Большая разница, если вы отображаете массивы. Особенно те, с NIL. Например:
print [nil,1,2]
дает
[nil,1,2]
но
puts [nil,1,2]
дает
12
Обратите внимание, что ни один элемент не отображается (просто пустая строка) и каждый элемент находится на отдельной строке.
Я заметил это сегодня, что привело меня сюда. Я хотел бы знать, что думают об этом. Кажется, это особый случай для путов для обработки таких массивов. Хотите знать, каково было обоснование ... Это просто быть аналогом другим языкам?
Дэн Баррон
Это имеет смысл, так как put будет выводить с новой строкой, поэтому вы можете думать об этом как об итерациях по массиву и вызове put в каждой строке ... однако странно, что он не выводитnil
Muers
42
printвыводит каждый аргумент, затем $,, до $stdout, затем $\. Это эквивалентноargs.join($,) + $\
putsустанавливает оба параметра $,и $\\ n, а затем делает то же самое, что и print. Главное отличие в том, что каждый аргумент представляет собой новую строку с puts.
Вы можете require 'english'получить доступ к этим глобальным переменным с понятными именами .
Записывает данный объект (ы) в ios . Возвращает nil.
Поток должен быть открыт для записи. Каждый данный объект, который не является строкой, будет преобразован путем вызова его to_sметода. При вызове без аргументов печатает содержимое $_.
Если разделитель выходного поля ( $,) отсутствует nil, он вставляется между объектами. Если разделитель выходной записи ( $\) отсутствует nil, он добавляется к выводу.
...
puts(obj, ...) → nil
Записывает данный объект (ы) в ios . Записывает новую строку после любой, которая еще не заканчивается последовательностью новой строки. Возвращает nil.
Поток должен быть открыт для записи. При вызове с аргументом массива записывает каждый элемент в новую строку. Каждый данный объект, который не является строкой или массивом, будет преобразован путем вызова его to_sметода. Если вызывается без аргументов, выводится одна новая строка.
Немного поэкспериментировав с пунктами, приведенными выше, различия кажутся:
Вызывается с несколькими аргументами, printразделяет их «разделителем выходного поля» $,(который по умолчанию не имеет значения), а putsразделяет их переводом строки. putsтакже ставит новую строку после последнего аргумента, пока printнет.
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
-1 по двум причинам. Во-первых, отсутствие ясности: я не понимаю, из-за чего здесь подразумевается первоначальное «Но ...», и не понимаю, на что отвечает «да» в последнем абзаце. Во-вторых, из-за отсутствия правильности: вы говорите, что использование printfвместо putsкода в вашем примере даст тот же результат, но на самом деле это не так. putsВариант добавляет символ новой строки в конце в то время как printfодин не делает, так же , как случай , когда нет никакого массива интерполированного в строку. (Обязательно, так как интерполяция происходит при оценке строкового литерала.)
Марк Эмери
Ага! Прочитав другие ответы, я понял, что понял - вы хотели, чтобы это был ответ на stackoverflow.com/a/14534145/1709587 ? В любом случае, это действительно не ответ на свой вопрос.
Ответы:
puts
добавляет новую строку в конец каждого аргумента, если его еще нет.print
не добавляет новую строку.Например:
puts [[1,2,3], [4,5,nil]]
Вернется:Принимая во внимание,
print [[1,2,3], [4,5,nil]]
что вернется:источник
Большая разница, если вы отображаете массивы. Особенно те, с NIL. Например:
дает
но
дает
Обратите внимание, что ни один элемент не отображается (просто пустая строка) и каждый элемент находится на отдельной строке.
источник
nil
print
выводит каждый аргумент, затем$,
, до$stdout
, затем$\
. Это эквивалентноargs.join($,) + $\
puts
устанавливает оба параметра$,
и$\
\ n, а затем делает то же самое, что иprint
. Главное отличие в том, что каждый аргумент представляет собой новую строку сputs
.Вы можете
require 'english'
получить доступ к этим глобальным переменным с понятными именами .источник
english
libДокументы API дают несколько полезных советов:
Немного поэкспериментировав с пунктами, приведенными выше, различия кажутся:
Вызывается с несколькими аргументами,
print
разделяет их «разделителем выходного поля»$,
(который по умолчанию не имеет значения), аputs
разделяет их переводом строки.puts
также ставит новую строку после последнего аргумента, покаprint
нет.puts
автоматически распаковывает массивы, покаprint
не:print
без аргументов печатает$_
(последнее, что прочитаноgets
), аputs
печатает новую строку:print
записывает разделитель выходной записи$\
после того, что он печатает,puts
игнорируя эту переменную:источник
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
Это полезно для вывода отладочного сообщения.
p "aa\n\t"
:aa\n\t
источник
Если вы хотите вывести массив внутри строки используя
puts
, вы получите тот же результат, что и при использованииprint
:Но если нет строки в кавычках, тогда да. Единственная разница между новой строкой, когда мы используем
puts
.источник
printf
вместоputs
кода в вашем примере даст тот же результат, но на самом деле это не так.puts
Вариант добавляет символ новой строки в конце в то время какprintf
один не делает, так же , как случай , когда нет никакого массива интерполированного в строку. (Обязательно, так как интерполяция происходит при оценке строкового литерала.)