Есть ли разница между p
и puts
в Ruby?
270
p foo
печатает foo.inspect
после новой строки, то есть печатает значение inspect
вместо to_s
, которое больше подходит для отладки (потому что вы можете, например, определить разницу между 1
, "1"
и "2\b1"
, что вы не можете при печати без inspect
).
p
также возвращает значение объекта, аputs
нет.1.9.3p125 :002 > (p "foo").class "foo" => String 1.9.3p125 :003 > (puts "foo").class foo => NilClass
to_s
- это стандартный метод для обработки строк в Ruby.inspect
, Как я уже сказал, это альтернативный строковый метод, который производит вывод, более подходящий для отладки. После завершения отладки вы, очевидно, должны удалить свои операторы отладки (или для более серьезных проектов вы, вероятно, должны использовать каркас ведения журналов и вообще не использовать p или put для отладки). Тот факт, чтоp
объект возвращается, кажется, не имеет значения в большинстве ситуаций (и я полагаю, что дал этот ответ раньше, чем это было так). Разница в выходных данных является основным (и раньше была единственной).Также важно отметить, что
puts
«реагирует» на класс, которыйto_s
определил,p
не делает. Например:Это следует непосредственно из
.inspect
звонка, но не очевидно на практике.источник
p foo
такой же какputs foo.inspect
источник
puts
возвращаетnil
,foo
а не как делаетp
.puts foo.inspect; foo
(-> {p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
. Много голосов не делает это хорошим ответом!В дополнение к ответам выше, есть небольшая разница в выводе консоли, а именно: наличие / отсутствие кавычек / кавычек, - которые могут быть полезны:
Я считаю это полезным, если вы хотите сделать простой индикатор выполнения, используя их близкий родственник, напечатайте :
Это дает индикатор прогресса 100%:
И это добавляет добавочный * на каждую итерацию:
источник
Из документа ruby-2.4.1
путы
давайте попробуем это на IRB
п
в ирб
источник
Эти 2 равны:
( inspect дает более буквальное представление об объекте по сравнению с методом to_s )
источник
(->{p "Hello World"}.call) == (-> {puts "Hello World".inspect}.call )
Это может проиллюстрировать одно из ключевых отличий, которое заключается в том, что
p
возвращает значение того, что ему передано, а гдеputs
возвращаетсяnil
.Тесты показывают
puts
медленнееисточник