Наприклад, у цьому рядку коду, який я написав, printі putsдаються різні результати.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Наприклад, у цьому рядку коду, який я написав, printі putsдаються різні результати.
1.upto(1000).each { |i| print i if i % 2 == 0 }
Відповіді:
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. Наприклад:
print [nil, 1, 2]
дає
[nil, 1, 2]
але
puts [nil, 1, 2]
дає
1
2
Зауважте, жоден елемент, що не відображається, нульовий (лише порожній рядок) і кожен елемент у іншому рядку.
nil
printвиводить кожен аргумент, за яким слідує $,, до $stdout, після чого $\. Це еквівалентноargs.join($,) + $\
putsвстановлює обидві $,і $\"\ n", а потім робить те саме, що і print. Ключова різниця полягає в тому, що кожен аргумент - це новий рядок puts.
Ви можете require 'english'отримати доступ до цих глобальних змінних із зручними іменами .
englishLib
Документи 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
=> nilputs автоматично розпаковує масиви, в той час 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
=> nilprintзаписує роздільник записів вихідних даних $\після того, що він друкує, при 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! => nilputsвиклик 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
Якщо ви хочете вивести масив у рядку, використовуючи puts, ви отримаєте такий самий результат, як і коли print:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Але якщо не відмовитись від цитованого рядка, то так. Єдина відмінність між новим рядком, коли ми використовуємо puts.
printfзамість putsкоду у прикладі дасть той же результат, але насправді це не так. putsВаріант додає символ нового рядка в кінці в той час як printfодин не робить, так само , як випадок , коли немає ніякого масиву інтерпольованого в рядок. (Обов'язково, оскільки інтерполяція трапляється при оцінці рядкового літералу.)