Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Он документировал здесь с остальным модулем ядра.

Ответ 2

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

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

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

Ответ 3

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

>> [1,2,3].each { |d| p d }
1
2
3

Ответ 4

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

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

Ответ 5

Ядро # p менее известно, чем печать и помещает.

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

Ссылки

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

Ответ 6

Чтобы понять разницу между 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">