2009-09-28 5 views
3

Je voudrais une méthode rubis « show » qui fait cela:méthode pratique de l'exploitation forestière ruby ​​

anyobject.show 

la sortie de l'appel serait:

anyvar => _the_ _pp_ _string_ _of_ _the_ _object_ 

Quelque chose proche, mais pas tout à fait est:

p "any_var => #{any_var.pretty_inspect}" 

Puisque vous devez taper "anyvar" pour accomplir cela.

Répondre

1

En général, cela ne peut pas être fait parce que les méthodes sont appelées sur des objets, pas sur des variables.

Edit:

Si vous êtes prêt à le faire avec une "fonction" plutôt que d'une méthode que vous pouvez ajouter à noyau:

def show(var) 
    print "#{var} => #{eval(var).pretty_inspect}" 
end 

et l'appeler via

show "anyvar" 

C'est un peu moche à cause de la nécessité de passer le nom de la variable en tant que chaîne, bien sûr.

+0

J'ai changé le soutien-gorge ckets un peu: def afficher (var) print "# {var} => # {eval (var) .pretty_inspect}" fin J'ai essayé une séance RIR avec a = 1; puis montrer ("a"); et il a renvoyé "nil" pour votre version, et "a est une variable indéfinie" pour ma version. $ a = 1; show ("$ a"); cependant, a travaillé. Ceci est un astucieux - mais existe-t-il un problème de portée (ne fonctionne pas pour les variables locales). ? – Gush

+3

Vous devez transmettre la liaison du contexte actuel à la méthode 'show':' def show (var, b); print "# {var} => # {eval (var, b) .pretty_inspect}"; end' puis "show" anyvar ", obligatoire" –

3

Cela devrait faire ce que vous demandez. Il imprime les informations lisibles sur un objet en format YAML:

puts YAML::dump(object) 

Ainsi, votre méthode show ressemblerait à ceci:

def show: 
    puts YAML::dump(self) 
end 

et ne pas oublier de:

require 'yaml' 
+0

non, il ne le fait pas. Au moins pas irb: >> a = "asdf" => "asdf" >> met YAML :: dump (a) --- asdf => nil – Gush

2

Un peu version améliorée de celle de Martin:

require 'pp' 
def show(var,bindings) 
    print "#{var} => #{eval('var',bindings).pretty_inspect}" 
end 

a,t = 1,Time.now 
show a,binding #=> a => 1 
show t,binding #=> t => Mon Sep 28 13:12:34 +0300 2009 
+2

Vous n'êtes pas passer le nom de la variable –

+0

oups !, modifié – khelll

+0

Je pense que var name doit être cité – Gush

Questions connexes