р против ставит в руби - PullRequest
       44

р против ставит в руби

258 голосов
/ 10 августа 2009

Есть ли разница между p и puts в Ruby?

Ответы [ 6 ]

318 голосов
/ 10 августа 2009

p foo печатает foo.inspect, за которым следует символ новой строки, т.е. он печатает значение inspect вместо to_s, что больше подходит для отладки (поскольку вы можете, например, определить разницу между 1, "1" и "2\b1", что невозможно при печати без inspect).

53 голосов
/ 10 августа 2009

Также важно отметить, что 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, но на практике это не очевидно.

38 голосов
/ 10 августа 2009

p foo совпадает с puts foo.inspect

2 голосов
/ 24 июня 2017

В дополнение к ответам, приведенным выше, есть небольшая разница в выводе консоли, а именно наличие / отсутствие кавычек / кавычек, которые могут быть полезны:

p "+++++"
>> "+++++"

puts "====="
>> =====

Я считаю это полезным, если вы хотите создать простой индикатор выполнения, используя их близкий родственник, print :

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
>> ******
1 голос
/ 21 июня 2018

Эти 2 равны:

p "Hello World"  
puts "Hello World".inspect

( inspect дает более буквальное представление объекта по сравнению с методом to_s )

1 голос
/ 07 июня 2017

С ruby-2.4.1 документ

помещает

puts(obj, ...) → nil

Записывает данный объект (ы) в ios. Записывает перевод строки после любого этого еще не заканчивается последовательностью новой строки. Возвращает ноль .

Поток должен быть открыт для записи. Если вызывается с массивом аргумент, записывает каждый элемент на новую строку. Каждый данный объект который не является строкой или массивом, будет преобразован путем вызова его 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...