Como despejo os campos de um objeto no console?


265

Quando estou executando um script Ruby simples, qual é a maneira mais fácil de despejar os campos de um objeto no console?

Estou procurando algo semelhante ao PHP print_r()que funcione com matrizes também.

Respostas:


420

Possivelmente:

puts variable.inspect

15
Adicionar um inspectmétodo à sua classe permite definir como os atributos da classe são exibidos, em vez de confiar na saída padrão. Muitas classes não o implementam bem, mas podem ser realmente úteis durante a depuração. Ruby voltará a to_snão encontrar um método de inspeção.
the Tin Man

4
O link atual está quebrado, Veja este ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing

5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . não funcionará para objetos mais complexos.
Ribamar

Como esta é a primeira resposta encontrada ao procurar um var_dumpequivalente php em ruby, descobri que ppé muito útil nesse caso, veja aqui - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin

Note que p objecté um apelido paraputs object.inspect
Jan Klimo 26/03

54

Você pode encontrar um uso para o methodsmétodo que retorna uma matriz de métodos para um objeto. Não é o mesmo que print_r, mas ainda é útil às vezes.

>> "Hello".methods.sort
=> ["%", "*", "+", "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", "[]", "[]=", "__id__", "__send__", "all?", "any?", "between?", "capitalize", "capitalize!", "casecmp", "center", "chomp", "chomp!", "chop", "chop!", "class", "clone", "collect", "concat", "count", "crypt", "delete", "delete!", "detect", "display", "downcase", "downcase!", "dump", "dup", "each", "each_byte", "each_line", "each_with_index", "empty?", "entries", "eql?", "equal?", "extend", "find", "find_all", "freeze", "frozen?", "grep", "gsub", "gsub!", "hash", "hex", "id", "include?", "index", "inject", "insert", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "intern", "is_a?", "is_binary_data?", "is_complex_yaml?", "kind_of?", "length", "ljust", "lstrip", "lstrip!", "map", "match", "max", "member?", "method", "methods", "min", "next", "next!", "nil?", "object_id", "oct", "partition", "private_methods", "protected_methods", "public_methods", "reject", "replace", "respond_to?", "reverse", "reverse!", "rindex", "rjust", "rstrip", "rstrip!", "scan", "select", "send", "singleton_methods", "size", "slice", "slice!", "sort", "sort_by", "split", "squeeze", "squeeze!", "strip", "strip!", "sub", "sub!", "succ", "succ!", "sum", "swapcase", "swapcase!", "taguri", "taguri=", "taint", "tainted?", "to_a", "to_f", "to_i", "to_s", "to_str", "to_sym", "to_yaml", "to_yaml_properties", "to_yaml_style", "tr", "tr!", "tr_s", "tr_s!", "type", "unpack", "untaint", "upcase", "upcase!", "upto", "zip"]

9
Usar a introspecção faz parte da diversão de Ruby. Muitas vezes, é útil subtrair um objeto da instance_methodsclasse 'em questão para obter métodos únicos:(String.instance_methods - Object.instance_methods).sort
o Tin Man

2
essa deve ser a resposta correta, pois eu esperava isso ao encontrar esta página.
precisa saber é o seguinte

.methods.sorté muito útil. Existe alguma maneira 'inteligente' de mostrar rapidamente métodos que são (vagamente) exclusivos para esse objeto em particular? Por exemplo, um método como .to_spode aparecer com frequência, portanto não é tão útil, mas alguns podem ser muito úteis para conhecer certos métodos para determinados objetos. Especialmente nos casos que não são óbvios. Existe alguma maneira de obtê-los rapidamente? (caso em questão, eu tenho um PG::Resultobjeto, e quer avaliar rapidamente os métodos susceptíveis eu poderia achar útil.
stevec

51

O to_yamlmétodo parece útil algumas vezes:

$foo = {:name => "Clem", :age => 43}

puts $foo.to_yaml

retorna

--- 
:age: 43
:name: Clem

(Isso depende de algum YAMLmódulo ser carregado? Ou isso normalmente estaria disponível?)


3
Sim, to_yamlrequer que o modelo YAML seja carregado. No entanto, faz parte da biblioteca padrão do Ruby.
213 Chuck

isso foi útil quando eu estava tentando inspecionar um objeto Amazon S3 em um console de aplicativos Rails.
Paul

32
p object

Doc Ruby para p.

p(*args) public

Para cada objeto, escreve diretamente obj.inspect seguido de uma nova linha na saída padrão do programa.


Não é o mesmo que variable.to_s? Descobri que apenas imprime uma referência de objeto, a menos que a classe substitui-lo explicitamente
roryf

15

Se você estiver procurando apenas as variáveis ​​de instância no objeto, isso pode ser útil:

obj.instance_variables.map do |var|
  puts [var, obj.instance_variable_get(var)].join(":")
end

ou como uma linha para copiar e colar:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")}

10

coloca foo.to_json

pode ser útil, pois o módulo json é carregado por padrão


4
to_jsonnão é carregado por padrão no 1.8.7 ou 1.9.2.
the Tin Man

5

Se você deseja imprimir um JSONrecuado :

require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))

5

Me deparei com esse tópico porque estava procurando por algo semelhante. Eu gosto das respostas e elas me deram algumas idéias, então testei o método .to_hash e também funcionou muito bem no caso de uso. soo:

object.to_hash


1
object.attribute_names

# => ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "marketing_permissions", "terms_and_conditions", "disable", "black_list", "zero_cost", "password_reset_token", "password_reset_sent_at"]


object.attributes.values

# => [1, "tom", "tom@tom.com", Tue, 02 Jun 2015 00:16:03 UTC +00:00, Tue, 02 Jun 2015 00:22:35 UTC +00:00, "$2a$10$gUTr3lpHzXvCDhVvizo8Gu/MxiTrazOWmOQqJXMW8gFLvwDftF9Lm", "2dd1829c9fb3af2a36a970acda0efe5c1d471199", true, nil, nil, nil, nil, nil, nil, nil] 

4
undefined method 'attributes' for ...
precisa saber é o seguinte

3
object.attributes_namenão funcionou, mas object.attributesserve para obter um bom hash de chaves e valores. Isso me ajudou, obrigado!
d3vkit
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.