Например, в этой строке кода я написал 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".