Яка різниця між друком і накладками?


Відповіді:


377

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, нуль]]
Зверніть увагу, як ставиться, не виводиться значення нуля, тоді як друк.

88
Власне, новий рядок після кожного аргументу. Це ключовий момент і не зрозуміло в документах Ruby (оскільки в прикладі є лише 1 аргумент).
cdunn2001

3
Є ще одна річ ... розширити клас масиву та замінити метод to_s. put не використовує нові to_s для об’єкта вашого нового класу, тоді як print
kapv89

1
використовуючи irb 0.9.5 put ("a"), а put ("a \ n") мають точно такий же вихід на REPL.
Маркус Юній Брут

@ kapv89 Це неправда: я щойно намагався, і обидва ставлять електронну друк за допомогою методу to_s. Тільки p не використовує його.
collimarco

6
@Fronker, це все-таки лише один аргумент. Компілятор поєднує суміжні рядки.
cdunn2001

61

Велика різниця, якщо ви показуєте масиви. Особливо тих, хто має NIL. Наприклад:

print [nil, 1, 2]

дає

[nil, 1, 2]

але

puts [nil, 1, 2]

дає

1
2

Зауважте, жоден елемент, що не відображається, нульовий (лише порожній рядок) і кожен елемент у іншому рядку.


1
Я сьогодні це помітив, що мене сюди привело. Мені б хотілося дізнатись про це. Мабуть, це особливий випадок для кладок для обробки масивів таким. Цікаво, що це було за обґрунтування ... Чи просто аналог інших мов?
Ден Баррон

Це має сенс, оскільки введення буде виводити з нового рядка, так що ви можете вважати це ітерацією на масиві, а виклик ставить на кожен рядок ... дивно, однак, він не виводитьnil
Muers

42

printвиводить кожен аргумент, за яким слідує $,, до $stdout, після чого $\. Це еквівалентноargs.join($,) + $\

putsвстановлює обидві $,і $\"\ n", а потім робить те саме, що і print. Ключова різниця полягає в тому, що кожен аргумент - це новий рядок puts.

Ви можете require 'english'отримати доступ до цих глобальних змінних із зручними іменами .


хороший наконечник на englishLib
lacostenycoder

18

Документи 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 > 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>  друк [1, [2, 3]], [4]
    [1, [2, 3]] [4] => нуль 
    2.1.3: 002>  ставить [1, [2, 3]], [4]
    1
    2
    3
    4
     => нуль
  • 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

4

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


-1

Якщо ви хочете вивести масив у рядку, використовуючи puts, ви отримаєте такий самий результат, як і коли print:

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

Але якщо не відмовитись від цитованого рядка, то так. Єдина відмінність між новим рядком, коли ми використовуємо puts.


1
-1 з двох причин. По-перше, недостатня ясність: я не розумію, з чого має на увазі початкове "Але ...", і я не розумію, на що відповідає "так" у заключному абзаці. По-друге, за відсутність коректності: ви говорите, що використання printfзамість putsкоду у прикладі дасть той же результат, але насправді це не так. putsВаріант додає символ нового рядка в кінці в той час як printfодин не робить, так само , як випадок , коли немає ніякого масиву інтерпольованого в рядок. (Обов'язково, оскільки інтерполяція трапляється при оцінці рядкового літералу.)
Марк

Ага! Прочитавши інші відповіді, я думаю, я розумію - ти задумав це відповідь на stackoverflow.com/a/14534145/1709587 ? У будь-якому випадку, це насправді не відповідає відповіді самостійно.
Марк Амері
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.