В чем разница между print и puts?



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



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

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 не выводит нулевое значение, тогда как 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 docs дать несколько хороших советов:

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

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

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

но...

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

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

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

Comments

    Ничего не найдено.