В чем разница между печатью и puts?

Например, в этой строке кода я написал print и puts для получения разных результатов.

1.upto(1000).each { |i| print i if i % 2 == 0 }

Ответ 1

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, в то время как печать делает.

Ответ 2

Большая разница в том, что вы показываете массивы. Особенно с NIL. Например:

print [nil, 1, 2]

дает

[nil, 1, 2]

но

puts [nil, 1, 2]

дает

1
2

Обратите внимание, что нет ни одного элемента (только пустая строка) и каждого элемента в другой строке.

Ответ 3

print выводит каждый аргумент, за которым следует $,, до $stdout, а затем $\. Это эквивалентно args.join($,) + $\

puts устанавливает как $,, так и $\ в "\n", а затем делает то же самое, что и print. Главное отличие состоит в том, что каждый аргумент представляет собой новую строку с puts.

Вы можете require 'english' получить доступ к этим глобальным переменным с дружественными именами.

Ответ 4

Документы 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

Ответ 5

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

Ответ 6

Команда print просто берет все, что вы ей даете, и печатает ее на экране. puts (для "put string" ) немного отличается: он добавляет новую (пустую) строку после того, что вы хотите напечатать.

Ответ 7

Если вы используете "печать", он не будет автоматически создавать новую строку. С помощью "puts" он автоматически создает новую строку.

Ответ 8

Но...

если вы хотите вывести массив в строку с помощью "puts", вы получите тот же результат, что и при использовании "print":

puts "#{[0, 1, nil]}":
[0, 1, nil]

Но если не использовать строку с кавычками, то да. Единственная разница между новой строкой, когда мы используем "puts".