Pregunta
Estoy seguro de que es una pregunta tonta a los que saben, pero no puedo encontrar una explicación de lo que hace o lo que es.
CSV.open('data.csv', 'r') do |row|
p row
end
¿Qué significa "p row
" hacer?
Solución
p()
es un método Kernel
Se escribe obj.inspect
a la salida estándar.
Debido objeto se mezcla en el módulo del kernel, el método p()
está disponible en todas partes.
Es común que, por cierto, para usarlo en Modo poesía , lo que significa que los parens se dejan caer. El fragmento CSV se puede escribir como ...
CSV.open 'data.csv', 'r' do |row|
p row
end
Está documentado aquí con el resto del kernel módulo.
Otros consejos
Kernel#p
es el hermano pequeño de depuración Kernel#puts
: más o menos funciona exactamente igual, pero que convierte sus argumentos usando #inspect
en lugar de #to_s
La razón por la que tiene un nombre tan críptica es para 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 y pp
Kernel#y
(YAML) de la biblioteca estándar yaml
.
¿Por qué no intentarlo?
>> [1,2,3].each { |d| p d }
1
2
3
La otra opción para la documentación que ya tiene en su sistema es el comando ri
. En cualquier momento se puede escribir: ri p
o si p
se define en muchos lugares (que lo es) para los comandos centrales puede probar ri Kernel.p
. Otras buenas opciones 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.
Kernel # p es menos conocido que el de impresión y pone.
Es similar a pone en que se añade una nueva línea, pero en lugar de to_s llamamiento, p llamadas inspeccionar.
Referencias
http: // garethrees .es / 2013/05/04 / P-vs-pone-vs-impresión-en-rubí /
Para entender la diferencia entre P y pone, hay que entender la diferencia entre to_s () e instancias () métodos.
to_s se utiliza para obtener la representación de cadena de un objeto mientras ejemplo es una mayor versión desarrollador de to_s que da contenido de los objetos también.
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">