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.

roryf
fonte

Respostas:

420

Possivelmente:

puts variable.inspect
Christian Lescuyer
fonte
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"]
dylanfm
fonte
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?)

mjs
fonte
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.

rampion
fonte
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(":")}
Mike
fonte
10

coloca foo.to_json

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

tjerk
fonte
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))
ROMANIA_engineer
fonte
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

Gregor
fonte
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", "[email protected]", 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] 
Conor
fonte
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