Наприклад, у цьому рядку коду, який я написав, 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'
отримати доступ до цих глобальних змінних із зручними іменами .
english
Lib
Документи 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
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
Якщо ви хочете вивести масив у рядку, використовуючи puts
, ви отримаєте такий самий результат, як і коли print
:
puts "#{[0, 1, nil]}":
[0, 1, nil]
Але якщо не відмовитись від цитованого рядка, то так. Єдина відмінність між новим рядком, коли ми використовуємо puts
.
printf
замість puts
коду у прикладі дасть той же результат, але насправді це не так. puts
Варіант додає символ нового рядка в кінці в той час як printf
один не робить, так само , як випадок , коли немає ніякого масиву інтерпольованого в рядок. (Обов'язково, оскільки інтерполяція трапляється при оцінці рядкового літералу.)