В чем разница между печатью и путами? - PullRequest
251 голосов
/ 16 февраля 2011

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

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

Ответы [ 6 ]

360 голосов
/ 16 февраля 2011

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]]
Обратите внимание, что put не выводит значение nil, тогда как print выводит.
61 голосов
/ 26 января 2013

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

print [nil, 1, 2]

дает

[nil, 1, 2]

, но

puts [nil, 1, 2]

дает

1
2

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

40 голосов
/ 16 февраля 2011

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

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

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

18 голосов
/ 10 октября 2014

Документы API дают несколько полезных советов:

print() → nil

print(obj, ...) → nil

Записывает заданный объект (ы)) до ios .Возвращает nil.

Поток должен быть открыт для записи.Каждый данный объект, который не является строкой, будет конвертирован путем вызова его метода to_s.При вызове без аргументов печатает содержимое $_.

Если разделитель выходного поля ($,) не равен nil, он вставляется между объектами.Если разделитель выходной записи ($\) не равен nil, он добавляется к выводу.

...

puts(obj, ...) → nil

Записывает заданное значениеобъект (ы) до ios .Записывает новую строку после любой, которая еще не заканчивается последовательностью новой строки.Возвращает nil.

Поток должен быть открыт для записи.При вызове с аргументом массива записывает каждый элемент в новую строку.Каждый данный объект, который не является строкой или массивом, будет конвертирован путем вызова его метода to_s.Если вызывается без аргументов, выводится одна новая строка.

Немного поэкспериментировав с указанными выше точками, различия выглядят следующим образом:

  • Вызывается с несколькими аргументами, print разделяет их с помощью «разделителя выходных полей» $, (который по умолчанию не имеет значения), а puts разделяет их символами новой строки.puts также помещает новую строку после последнего аргумента, в то время как print - нет.

    2.1.3 :001 > <b>print 'hello', 'world'</b>
    helloworld => nil 
    2.1.3 :002 > <b>puts 'hello', 'world'</b>
    hello
    world
     => nil
    2.1.3 :003 > <b>$, = 'fanodd'</b>
     => "fanodd" 
    2.1.3 :004 > <b>print 'hello', 'world'</b>
    hellofanoddworld => nil 
    2.1.3 :005 > <b>puts 'hello', 'world'</b>
    hello
    world
     => nil
  • puts автоматически распаковывает массивы, тогда как print нет:

    2.1.3 :001 > <b>print [1, [2, 3]], [4]</b>
    [1, [2, 3]][4] => nil 
    2.1.3 :002 > <b>puts [1, [2, 3]], [4]</b>
    1
    2
    3
    4
     => nil
  • print без аргументов печатает $_ (последняя вещь, прочитанная gets), в то время как puts печатает новую строку:

    2.1.3 :001 > <b>gets</b>
    <b>hello world</b>
     => "hello world\n" 
    2.1.3 :002 > <b>puts</b>
    
     => nil 
    2.1.3 :003 > <b>print</b>
    hello world
     => nil
  • print записывает разделитель выходной записи $\ после того, как он печатает, тогда как puts игнорирует эту переменную:

    mark@lunchbox:~$ irb
    2.1.3 :001 > <b>$\ = 'MOOOOOOO!'</b>
     => "MOOOOOOO!" 
    2.1.3 :002 > <b>puts "Oink! Baa! Cluck! "</b>
    Oink! Baa! Cluck! 
     => nil 
    2.1.3 :003 > <b>print "Oink! Baa! Cluck! "</b>
    Oink! Baa! Cluck! MOOOOOOO! => nil
3 голосов
/ 26 декабря 2014

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

например: puts "one two": one two

{новая строка}

puts "one two\n": one two

{новая строка} #puts не добавит новую строку в результат, так как строка заканчивается новой строкой

print "one two": one two

print "one two\n": one two

{новая строка}

И есть еще один способ вывода: p

Для каждого объекта непосредственно записывает obj.inspect, а затем перевод строки в стандартный вывод программы.

Полезно вывести отладочное сообщение. p "aa\n\t": aa\n\t

0 голосов
/ 04 сентября 2014

Но ...

если вы хотите вывести массив внутри строки, используя «put», вы получите тот же результат, что и при использовании «print»:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...