Что такое "р" в Ruby?
Я уверен, что это глупый вопрос для тех, кто знает, но я не могу найти объяснение того, что он делает или что это такое.
CSV.open('data.csv', 'r') do |row|
p row
end
Что значит "p row
" делать?
6 ответов
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 и put.
Это похоже на вставку в том, что он добавляет новую строку, но вместо вызова to_s, p вызывает inspect.
Рекомендации
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
Чтобы понять разницу между 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">