Что такое "р" в Ruby? - PullRequest
       56

Что такое "р" в Ruby?

44 голосов
/ 18 ноября 2009

Я уверен, что это глупый вопрос для тех, кто знает, но я не могу найти объяснения того, что он делает или что это.

CSV.open('data.csv', 'r') do |row|
  p row
end

Что делает "p row"?

Ответы [ 6 ]

79 голосов
/ 18 ноября 2009

p() - это метод ядра

Записывает obj.inspect на стандартный вывод.

Поскольку объект смешивается в модуле ядра, метод p() доступен везде.

Между прочим, это обычно используется в режиме поэзии , что означает, что парены отбрасываются Фрагмент CSV можно записать как ...

CSV.open 'data.csv', 'r' do |row|
  p row
end

Это задокументировано здесь с остальной частью модуля Kernel .

22 голосов
/ 18 ноября 2009

Kernel#p является младшим братом-отладчиком Kernel#puts: он более или менее работает точно так же, как он, но он преобразовывает свои аргументы, используя #inspect вместо #to_s.

Причина, по которой у него такое загадочное имя, заключается в том, что вы можете быстро бросить его в выражение и снова извлечь его при отладке. (Я полагаю, что теперь это намного менее полезно, так как Ruby становится все лучше и лучше "правильной" поддержки отладки.)

Некоторыми альтернативами Kernel#p являются Kernel#pp (симпатичная печать) из стандартной библиотеки pp и Kernel#y (YAML) из стандартной библиотеки yaml.

5 голосов
/ 18 ноября 2009

Почему бы не попробовать?

>> [1,2,3].each { |d| p d }
1
2
3
2 голосов
/ 18 ноября 2009

Другая опция для документации, которая у вас уже есть в вашей системе - это команда ri. В любое время вы можете набрать: ri p или, если во многих местах определено p, для центральных команд вы можете попробовать ri Kernel.p. Другие хорошие ставки: Array.<whatever method> или String.<whatever method>.

Если вы в конечном итоге установите кучу драгоценных камней, это сильно замедлится, но вы можете найти камень fastri, который невероятно ускоряет процесс поиска.

1 голос
/ 17 июля 2014

Ядро # p менее известно, чем print и put.

Это похоже на вставку в том, что он добавляет новую строку, но вместо вызова to_s, p вызывает inspect.

Ссылки

http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/

0 голосов
/ 28 ноября 2017

Чтобы понять разницу между p и put, вы должны понимать разницу между методами to_s () и instance ().

to_s используется для получения строкового представления объекта, в то время как instance является более удобной для разработчика версией to_s, которая также предоставляет содержимое объектов.

class Dog
        def initialize(name, breed)
            @name = name
            @breed = breed
        end
        def to_s
            puts  "#@name's breed is #@breed."
        end
end

terra=Dog.new("Terra","Husky")
puts terra #Terra's breed is Husky.
p terra    #<Dog:0x00007fbde0932a88 @name="Terra", @breed="Husky">  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...