2009-09-28 49 views
3

我想一个红宝石方法“秀”,它做到这一点:红宝石记录便捷方法

anyobject.show 

呼叫的输出将是:

anyvar => _the_ _pp_ _string_ _of_ _the_ _object_ 

一些接近,但不完全是:

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

既然你必须输入“anyvar”来完成。

回答

1

一般来说,这是不能做到的,因为方法是在对象上调用的,而不是在变量上调用的。

编辑:

如果你愿意用“功能”来做到这一点,而不是一个方法,你可以将它添加到内核:

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

,并通过

show "anyvar" 
叫它

由于需要将字符串中的变量名传递给它,这有点难看。

+0

我改了胸罩打成小包有点: DEF显示(VAR) 打印 “#{VAR} =>#{的eval(VAR).pretty_inspect}” 端 我与= 1试图在IRB会话;然后显示(“a”);并且它为您的版本返回“nil”,而对于我的版本,“a是未定义的变量”。 $ a = 1; show(“$ a”);但是,工作。 这是一个聪明 - 但有一个范围问题(不适用于局部变量)。 ? – Gush 2009-09-28 09:36:02

+3

您需要将当前上下文的绑定传递给'show'方法:'def show(var,b);打印“#{var} =>#{eval(var,b).pretty_inspect}”;结束“,然后”显示“anyvar”,绑定“ – 2009-09-28 12:26:42

3

这应该做你在问什么。它打印关于YAML格式的对象可读信息:

puts YAML::dump(object) 

所以,你的表演方法是这样的:

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

,不要忘了:

require 'yaml' 
+0

不,它没有。至少在IRB: >> A = “ASDF” => “ASDF” >>把YAML ::转储(一) --- ASDF =>零 – Gush 2009-09-28 09:38:33

2

小马丁的增强版之一:

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

你不是传递变量名 – 2009-09-28 12:32:35

+0

哎呀!,修改 – khelll 2009-09-28 13:03:55

+0

我认为var名称需要引用 – Gush 2009-11-10 15:30:25