Например, в этой строке кода я написал 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,nil]]
Обратите внимание, что puts не выводит значение nil, в то время как печать делает.
Большая разница в том, что вы показываете массивы. Особенно с NIL. Например:
print [nil, 1, 2]
дает
[nil, 1, 2]
но
puts [nil, 1, 2]
дает
1
2
Обратите внимание, что нет ни одного элемента (только пустая строка) и каждого элемента в другой строке.
print
выводит каждый аргумент, за которым следует $,
, до $stdout
, а затем $\
. Это эквивалентно args.join($,) + $\
puts
устанавливает как $,
, так и $\
в "\n", а затем делает то же самое, что и print
. Главное отличие состоит в том, что каждый аргумент представляет собой новую строку с puts
.
Вы можете require 'english'
получить доступ к этим глобальным переменным с дружественными именами.
Документы API дают несколько хороших советов:
print() → nil
print(obj, ...) → nil
Записывает данный объект в ios. Поток должен быть открыт для записи. Если разделитель выходного поля (
$,
) не равен нулю, он будет вставлен между каждым объектом. Если разделитель выходной записи ($\
) не равен нулю, он будет добавлен к выходу. Если аргументы не заданы, выводится$_
. Объекты, которые arent-строки будут преобразованы, вызывая их метод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
игнорирует эту переменную:
[email protected]:~$ 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.inspect, за которым следует новая строка для стандартного вывода программ.
Полезно выводить сообщение об отладке.
p "aa\n\t"
: aa\n\t
Команда print
просто берет все, что вы ей даете, и печатает ее на экране. puts
(для "put string" ) немного отличается: он добавляет новую (пустую) строку после того, что вы хотите напечатать.
Если вы используете "печать", он не будет автоматически создавать новую строку. С помощью "puts" он автоматически создает новую строку.
Но...
если вы хотите вывести массив в строку с помощью "puts", вы получите тот же результат, что и при использовании "print":
puts "#{[0, 1, nil]}":
[0, 1, nil]
Но если не использовать строку с кавычками, то да. Единственная разница между новой строкой, когда мы используем "puts".