2009-11-18 10 views
43

Sono sicuro che è una domanda sciocca per coloro che sanno, ma non riesco a trovare una spiegazione di cosa fa o di cosa si tratta.Che cos'è "p" in Ruby?

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

Cosa fa "p row"?

risposta

77

p() è un metodo Kernel

Scrive obj.inspect sullo standard output.

Poiché l'oggetto si mescola nel modulo Kernel, il metodo p() è disponibile ovunque.

È comune, btw, usarlo in in modalità poesia, il che significa che i paren vengono eliminati. Il frammento di CSV può essere scritto come ...

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

E 'documentato modulo here with the rest of the Kernel.

+1

+1 per aggiungere il collegamento al documento – edwardsmatt

+1

Il collegamento diretto ai documenti per p - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p – Joe

5

Perché non provarlo?

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

In realtà si chiama '# inspect' al suo argomento prima, ma quasi abbastanza;) – hrnt

+0

Vero. Rimosso il mio commento "alias" poiché è semplicemente sbagliato. Forse più come "wrapper". – rfunduk

22

Kernel#p è il fratello minore di debug di Kernel#puts: più o meno funziona come esattamente, ma converte i suoi argomenti utilizzando #inspect invece di #to_s.

Il motivo per cui ha un nome così criptico è che puoi lanciarlo rapidamente in un'espressione e rimuoverlo di nuovo durante il debug. (Credo che sia molto meno utile ora che Ruby è sempre meglio "corretto" supporto di debug.)

Alcune alternative a Kernel#p sono Kernel#pp (piuttosto di stampa) della libreria standard pp e Kernel#y (YAML) dal yaml libreria standard.

2

L'altra opzione per la documentazione già presente nel sistema è il comando ri. In qualsiasi momento puoi digitare: ri p o se p è definito in molti posti (che è) per i comandi centrali puoi provare ri Kernel.p. Altre buone scommesse sono Array.<whatever method> o String.<whatever method>.

Se si finisce per installare un gruppo di gemme, questo rallenterà molto, ma è possibile cercare la gemma veloce che accelera incredibilmente il processo di ricerca.

0

per capire la differenza tra P e mette, è necessario comprendere differenza tra to_s() e l'istanza() metodi.

to_s viene utilizzato per ottenere la rappresentazione di stringa di un oggetto mentre instance è una versione più amichevole per gli sviluppatori di to_s che fornisce anche il contenuto degli oggetti.

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