2011-09-12 47 views
3

我有一個方法接受將被調用的lambda或將被評估的字符串。 爲什麼下面的方法失敗:Ruby中奇怪的過程錯誤

def test(expr) 
    expr = expr.respond_to?(:call) ? expr : ->{ eval(expr) } 
    expr.call 
end 

test 'puts 1' 
# => TypeError: can't convert Proc into String 

但這一工作:

def test(expr) 
    foo = expr 
    expr = expr.respond_to?(:call) ? expr : ->{ eval(foo) } 
    expr.call 
end 

test 'puts 1' 
# => 1 
+0

錯字?真的拼寫epr? –

+0

是錯字,修正。 –

+1

只要確保。很高興看到你有兩個很好的答案。 –

回答

3

在這裏:

expr = expr.respond_to?(:call) ? expr : ->{ eval(expr) } 

你有一個Proc最終在expr這是一個封閉在expr所以當PROC評估,它試圖eval本身,因爲拉姆達內expr是拉姆達本身。

在這裏:

foo = expr 
expr = expr.respond_to?(:call) ? expr : ->{ eval(foo) } 

關閉超過foo其中提到expr原始字符串值,所以沒有時髦的自我指涉的混亂,你將最終在字符串中使用eval

+0

明白了!謝謝。 –

+0

@ream88:維克多是第一個,所以你應該給他勾選標記(我不會個人承認,誠實),我只是想澄清一下發生了什麼。 –

+0

+1呼出「自我指涉」。 (也贊成維克多是正確的_and_第一。) –

3

你是可變expr分配拉姆達。該lambda試圖評估變量expr的內容(即試圖評估自己)。 eval僅需要字符串,這就是引發異常的原因。