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?

¿Fue útil?

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">  
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top