Что такое "р" в 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">  
Другие вопросы по тегам