web-dev-qa-db-fra.com

Qu'est-ce que "p" en Ruby?

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"?

44
James P. Wright

p() est une méthode du noyau

Il é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.

79
DigitalRoss

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.

22
Jörg W Mittag

Pourquoi ne pas l'essayer?

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

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. 

2
Chuck Vose

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/

1
Don

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">  
0
Nitin A.