Есть ли разница между p
и puts
в Ruby?
P vs помещает в Ruby
Ответ 1
p foo
печатает foo.inspect
, за которым следует новая строка, т.е. печатает значение inspect
вместо to_s
, что более подходит для отладки (потому что вы можете, например, рассказать разницу между 1
, "1"
и "2\b1"
, которые вы не можете при печати без inspect
).
Ответ 2
Также важно отметить, что puts
"реагирует" на класс, который имеет to_s
, p
не работает. Например:
class T
def initialize(i)
@i = i
end
def to_s
@i.to_s
end
end
t = T.new 42
puts t => 42
p t => #<T:0xb7ecc8b0 @i=42>
Это следует непосредственно из вызова .inspect
, но на практике это не очевидно.
Ответ 3
p foo
совпадает с puts foo.inspect
Ответ 4
путы
puts(obj, ...) → nil
Записывает данный объект в ios. Записывает новую строку после любого сделать еще не завершение новой строки. Возвращает nil.
Поток должен быть открыт для записи. Если вызывается с массивом аргумент, пишет каждый элемент в новой строке. Каждый заданный объект что isnt строка или массив будут преобразованы, вызвав ее
to_s
метод. Если вызывается без аргументов, выводится одна новая строка.
попробуйте его на irb
# always newline in the end
>> puts # no arguments
=> nil # return nil and writes a newline
>> puts "sss\nsss\n" # newline in string
sss
sss
=> nil
>> puts "sss\nsss" # no newline in string
sss
sss
=> nil
# for multiple arguments and array
>> puts "a", "b"
a
b
=> nil
>> puts "a", "b", ["c", "d"]
a
b
c
d
=> nil
р
p(obj) → obj click to toggle source
p(obj1, obj2, ...) → [obj, ...]
p() → nil
Для каждого объекта напрямую записываетсяobj.inspect
, за которым следует новая строка для стандартного вывода программ.
в irb
# no arguments
>> p
=> nil # return nil, writes nothing
# one arguments
>> p "sss\nsss\n"
"sss\nsss\n"
=> "aaa\naaa\n"
# multiple arguments and array
>> p "a", "b"
"a"
"b"
=> ["a", "b"] # return a array
>> p "a", "b", ["c", "d"]
"a"
"b"
["c", "d"]
=> ["a", "b", ["c", "d"]] # return a nested array
Ответ 5
В дополнение к приведенным выше ответам есть тонкая разница в выпуске консоли - а именно наличие/отсутствие перевернутых запятых/кавычек - которые могут быть полезны:
p "+++++"
>> "+++++"
puts "====="
>> =====
Я считаю это полезным, если вы хотите сделать простой индикатор выполнения, используя их близкий родственник, напечатать:
array = [lots of objects to be processed]
array.size
>> 20
Это дает 100% индикатор выполнения:
puts "*" * array.size
>> ********************
И это добавляет инкрементный * на каждой итерации:
array.each do |obj|
print "*"
obj.some_long_executing_process
end
# This increments nicely to give the dev some indication of progress / time until completion
>> ******