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