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


Відповіді:


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.