debug - ruby binding pry
¿Qué es "p" en Ruby? (6)
p()
es un método de Kernel
Escribe obj.inspect
a la salida estándar.
Debido a que el objeto se mezcla en el módulo Kernel, el método p()
está disponible en todas partes.
Es común, por cierto, usarlo en modo poesía , lo que significa que los parens se eliminan. El fragmento de código CSV se puede escribir como ...
CSV.open ''data.csv'', ''r'' do |row|
p row
end
Está documentado aquí con el resto del módulo Kernel .
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.
CSV.open(''data.csv'', ''r'') do |row|
p row
end
¿Qué hace " p row
"?
¿Por qué no intentarlo?
>> [1,2,3].each { |d| p d }
1
2
3
El kernel # p es menos conocido que imprimir y poner.
Es similar a las entradas que agrega una nueva línea, pero en lugar de llamar a_s, p llama a inspeccionar.
Referencias
http://garethrees.co.uk/2013/05/04/p-vs-puts-vs-print-in-ruby/
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 p
está definido en muchos lugares (lo que es) para los comandos centrales, puede probar ri Kernel.p
. Otras buenas apuestas son Array.<whatever method>
o String.<whatever method>
.
Si terminas instalando un montón de gemas, esto se ralentizará mucho, pero puedes buscar la gema fastri que acelera el proceso de búsqueda increíblemente.
Para comprender la diferencia entre p y puts, debe comprender la diferencia entre los métodos to_s () y instance ().
to_s se usa para obtener una representación de cadena de un objeto, mientras que la instance es una versión más amigable para el desarrollador de to_s que también proporciona 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">
Kernel#p
es el pequeño hermano de debugging de Kernel#puts
: funciona más o menos exactamente igual que él, pero convierte sus argumentos usando #inspect
lugar de #to_s
.
La razón por la que tiene un nombre tan críptico es para que pueda lanzarlo rápidamente en una expresión y eliminarlo de nuevo cuando realice la depuración. (Supongo que es mucho menos útil ahora que Ruby está mejorando y mejorando el soporte de depuración "adecuado").
Algunas alternativas al Kernel#p
son Kernel#pp
(impresión bonita) de la biblioteca estándar de pp
y Kernel#y
(YAML) de la biblioteca estándar de yaml
.