2009-11-18 10 views
43

Estoy seguro de que es una pregunta tonta para los que saben, pero no puedo encontrar una explicación de lo que hace o lo que es.¿Qué es "p" en Ruby?

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

¿Qué significa "p row" do?

Respuesta

77

p() es un método Kernel

Se escribe obj.inspect a la salida estándar.

porque el objeto se mezcla en el módulo del kernel, el método p() está disponible en todas partes.

Es común, por cierto, usarlo en el modo de poesía , lo que significa que los parens se descartan. El fragmento CSV se puede escribir como ...

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

se documenta here with the rest of the Kernel módulo.

+1

+1 para agregar el enlace al documento – edwardsmatt

+1

El enlace directo a los documentos para p - http://www.ruby-doc.org/core-1.8.7/Kernel.html#method-i-p – Joe

5

¿Por qué no intentarlo?

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

En realidad se llama '# inspect' a su argumento en primer lugar, pero cerca suficiente;) – hrnt

+0

verdadera. Se eliminó mi comentario de 'alias' ya que es simplemente incorrecto. Tal vez más como 'envoltorio'. – rfunduk

22

Kernel#p es el hermano pequeño de depuración Kernel#puts: más o menos funciona exactamente igual, pero Convierte sus argumentos usando #inspect en lugar de #to_s.

La razón por la que tiene un nombre tan críptica es por lo que se puede tirar rápidamente en una expresión y llevarlo de nuevo al depurar. (Supongo que es mucho menos útil ahora que Ruby es cada vez mejor y mejor soporte de depuración "correcta".)

Algunas alternativas a Kernel#p son Kernel#pp (impresión bonita) de la biblioteca estándar pp y Kernel#y (YAML) de la yaml biblioteca estándar.

2

La otra opción para la documentación que ya tiene en su sistema es el comando ri. En cualquier momento puede escribir: ri p o si se define p en muchos lugares (lo cual es) para comandos centrales, puede intentar ri Kernel.p. Otras buenas apuestas son Array.<whatever method> o String.<whatever method>.

Si al final de la instalación de un montón de gemas este se ralentizará mucho, pero se puede buscar la joya fastri lo que acelera el proceso de búsqueda increíblemente.

0

Para entender la diferencia entre P y pone, que deben entender la diferencia entre to_s() y la instancia() métodos.

to_s se utiliza para obtener la representación de cadena de un objeto, mientras que instance es una versión más amigable para desarrolladores de to_s que también proporciona el contenido de los objetos.

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