Je suis sûr que c’est une question idiote pour ceux qui savent, mais je ne trouve pas d’explication sur ce que cela fait ou ce que c’est.
CSV.open('data.csv', 'r') do |row|
p row
end
Que fait "p row
"?
p()
est une méthode du noyauIl écrit obj.inspect
sur la sortie standard.
Comme Object est mélangé dans le module du noyau, la méthode p()
est disponible partout.
Il est commun, d'ailleurs, de l'utiliser dans mode poésie , ce qui signifie que les parens sont abandonnés. L'extrait de fichier CSV peut être écrit comme ...
CSV.open 'data.csv', 'r' do |row|
p row
end
C'est documenté ici avec le reste du noyau module.
Kernel#p
est le petit frère de débogage de Kernel#puts
: il fonctionne plus ou moins exactement de la même façon, mais il convertit ses arguments en utilisant #inspect
au lieu de #to_s
.
La raison pour laquelle il porte un nom aussi crypté est que vous pouvez rapidement le jeter dans une expression et le sortir à nouveau lors du débogage. (Je suppose que c'est beaucoup moins utile maintenant que Ruby obtient de mieux en mieux le support de débogage "approprié".)
Certaines alternatives à Kernel#p
sont Kernel#pp
(jolie impression) de la bibliothèque standard pp
et Kernel#y
(YAML) de la bibliothèque standard yaml
.
Pourquoi ne pas l'essayer?
>> [1,2,3].each { |d| p d }
1
2
3
L’autre option pour la documentation que vous avez déjà sur votre système est la commande ri
. À tout moment, vous pouvez taper: ri p
ou si p
est défini dans de nombreux emplacements (ce qui est le cas) pour les commandes centrales, vous pouvez essayer ri Kernel.p
. Les autres bons paris sont Array.<whatever method>
ou String.<whatever method>
.
Si vous finissez par installer un tas de gemmes, cela ralentira beaucoup, mais vous pouvez rechercher le gem Fastri qui accélère incroyablement le processus de recherche.
Le noyau # p est moins connu que print et met.
Cela ressemble à une insertion car elle ajoute une nouvelle ligne, mais plutôt que d'appeler to_s, p appelle inspect.
Références
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-Ruby/
Pour comprendre la différence entre p et met, vous devez comprendre la différence entre les méthodes to_s () et instance ().
to_s est utilisé pour obtenir la représentation sous forme de chaîne d'un objet tandis que instance est une version de to_s plus conviviale pour les développeurs, qui donne également le contenu des objets.
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">