2009-09-28 84 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