Вопрос

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

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">  
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top