Что такое “p” в Ruby?
-
20-09-2019 - |
Вопрос
Я уверен, что это глупый вопрос для тех, кто знает, но я не могу найти объяснения того, что он делает или что это такое.
CSV.open('data.csv', 'r') do |row|
p row
end
Что делает "p row
" делать?
Решение
p()
является методом ядра
Он пишет obj.inspect
к стандартному выводу.
Поскольку объект смешивается в модуле ядра, p()
метод доступен везде.
Кстати, это обычное дело - использовать его в режим поэзии, что означает, что скобки отброшены.Фрагмент CSV-файла может быть написан следующим образом...
CSV.open 'data.csv', 'r' do |row|
p row
end
Это задокументировано здесь вместе с остальной частью Ядра модуль.
Другие советы
Kernel#p
является младшим братом по отладке Kernel#puts
:он более или менее работает точно так же, но преобразует свои аргументы, используя #inspect
вместо того , чтобы #to_s
.
Причина, по которой у него такое загадочное имя, заключается в том, что вы можете быстро вставить его в выражение и снова извлечь при отладке.(Я думаю, теперь это намного менее полезно, поскольку Ruby получает все лучшую и лучшую "правильную" поддержку отладки.)
Некоторые альтернативы Kernel#p
являются Kernel#pp
(симпатичный принт) из pp
стандартная библиотека и Kernel#y
(YAML) из yaml
стандартная библиотека.
Почему бы не попробовать это?
>> [1,2,3].each { |d| p d }
1
2
3
Другим вариантом для документации, которая у вас уже есть в вашей системе, является ri
команда.В любое время вы можете ввести: ri p
или если p
определяется во многих местах (что так и есть) для центральных команд, которые вы можете попробовать ri Kernel.p
.Другими хорошими ставками являются Array.<whatever method>
или String.<whatever method>
.
Если вы в конечном итоге установите кучу драгоценных камней, это сильно замедлит работу, но вы можете найти драгоценный камень fastri, который невероятно ускоряет процесс поиска.
Ядро #p менее известно, чем print и puts.
Это похоже на puts in тем, что добавляет новую строку, но вместо вызова to_s p вызывает inspect .
Ссылки
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
Чтобы понять разницу между p и puts, вы должны понимать разницу между методами to_s() и instance().
to_s используется для получения строкового представления объекта , в то время как экземпляр это более удобная для разработчиков версия 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">