Question Qu'est-ce que "p" dans Ruby?


Je suis sûr que c'est une question idiote pour ceux qui savent, mais je ne peux pas trouver une explication de ce qu'il fait ou de ce que c'est.

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

Qu'est-ce que "p row" faire?


43
2017-11-18 19:03


origine


Réponses:


p() est une méthode du noyau

Il écrit obj.inspect à la sortie standard.

Parce que Object mélange dans le module du noyau, le p() méthode est disponible partout.

Il est courant de l'utiliser dans mode poésie, ce qui signifie que les parens sont supprimés. Le fragment 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.


78
2017-11-18 19:07



Kernel#p est le petit frère de débogage de Kernel#puts: ça marche plus ou moins exactement comme ça, mais il convertit ses arguments en utilisant #inspect au lieu de #to_s.

La raison pour laquelle il a un tel nom cryptique est que vous pouvez rapidement le jeter dans une expression et le reprendre lors du débogage. (J'imagine que cela est beaucoup moins utile maintenant que Ruby est de mieux en mieux et que son support de débogage est "correct".)

Quelques alternatives à Kernel#p sont Kernel#pp (jolie impression) de la pp bibliothèque standard et Kernel#y (YAML) du yaml bibliothèque standard.


22
2017-11-18 19:33



Pourquoi ne pas l'essayer?

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

5
2017-11-18 19:05



L’autre option pour la documentation que vous avez déjà sur votre système est la ri commander. A tout moment vous pouvez taper: ri p ou si p est défini dans de nombreux endroits (ce qu'il est) pour les commandes centrales que vous pouvez essayer ri Kernel.p. D'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 la gemme fastri qui accélère incroyablement le processus de recherche.


2
2017-11-18 19:51



Le noyau # p est moins connu que l'imprimé et le met.

Il est similaire à put en ce sens qu'il ajoute une nouvelle ligne, mais plutôt que d'appeler to_s, p appelle inspecter.

Les références

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


1
2017-07-17 04:37



Pour comprendre la différence entre p et put, vous devez comprendre la différence entre les méthodes to_s () et instance ().

to_s est utilisé pour obtenir une représentation sous forme de chaîne d'un objet pendant que exemple 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
2017-11-27 21:08