2015-10-14 75 views
3

根據ruby-doc.orgkernel#eval需要綁定對象作爲第二個參數,如下所示:eval和binding:它們對於什麼有用?

Const = 7 
p eval("Const", binding) # => 7 

方法eval可以與由接受一個參數的方法get_binding返回的對象一起使用:

def get_binding(param) 
    return binding 
end 
n = get_binding(7) 
p eval("param", n) # => 7 

在第一段代碼中,我們得到的值爲Const,在第二段代碼中,我們得到的值爲param。如果我們使用evalbinding來檢索我們已知的值,那麼這些方法有用的是什麼?

+2

這些都是簡單的例子,說明'Binding'和'eval' *如何工作*,*不是*真實世界的應用程序如何使用*。特別是,使用帶有常量字符串的'eval'沒有任何意義,您通常將它與包含一些未知或動態構建的部分的字符串一起使用。 –

回答

2

爲了便於討論,可以說你正在研究一個模板引擎 - 它將處理給定的文本,並用它的值替換其中的Ruby代碼。我們可以使用eval

作爲通用引擎,模板文本應該允許使用Ruby變量,其值將在調用者的綁定中定義。在這種情況下,通過綁定到eval,我們可以允許用戶的綁定用於變量評估。

一個基本的,不優雅,方法如下所示:

template = "Hello @[email protected] @[email protected]" 

def process(template, b) 
    vars = template.scan(/@(\w+)@/).flatten 
    vars.each {|v| template = template.gsub("@#{v}@", eval("#{v}", b)) } 
    return template 
end 

first_name = "Wand" 
last_name = "Maker" 

str = process(template, binding) 
p str 
#=> "Hello Wand Maker" 

first_name = "Rubeus" 
last_name = "Hagrid" 
p process(template, binding) 
#=> "Hello Rubeus Hagrid" 

有些類似的方法已在再培訓局,Ruby的內置的模板引擎被使用。你可以看看source code

相關問題