Я уверен, что это глупый вопрос для тех, кто знает, но я не могу найти объяснение того, что он делает или что это такое.
CSV.open('data.csv', 'r') do |row|
p row
end
Что делает "p row
"?
Я уверен, что это глупый вопрос для тех, кто знает, но я не могу найти объяснение того, что он делает или что это такое.
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>
.
Если вы закончите установку кучки драгоценных камней, это значительно замедлит работу, но вы сможете найти быстрый кристалл, который ускоряет процесс поиска невероятно.
Ядро # p менее известно, чем печать и помещает.
Это похоже на то, что он добавляет новую строку, а не вызывает to_s, p вызывает проверку.
Ссылки
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 breed is #@breed."
end
end
terra=Dog.new("Terra","Husky")
puts terra #Terra breed is Husky.
p terra #<Dog:0x00007fbde0932a88 @name="Terra", @breed="Husky">