В чем разница между 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]

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