2010-06-08 36 views
4

我想一個變量傳遞給像一個動態聲明的方法:我可以將變量傳遞給eval嗎?

eval(def test(name) 
puts name 
end 
test 'joe') 

,但它不工作。

有沒有辦法做到這一點?

+1

我真的很困惑你想做什麼。 'eval'不是這份工作的工具。 'define_method'如何? – Matchu 2010-06-08 04:12:27

回答

9

eval需要一個字符串。以下應該工作正常:

eval "def test(name) 
    puts name 
end 
test 'joe'" 
+0

感謝提醒布賴恩。有用。 不知道爲什麼我錯過了。 – Nick 2010-06-08 16:39:08

0

我對你想要做什麼有點困惑。如果你正在試圖確定與EVAL的方法,可以採取這裏的參數是例如:

eval "def test(name) 
    puts name 
end" 

test 'joe' 

如果你想使用eval定義爲更具活力和使用變量的方法,因爲正如布賴恩指出出EVAL需要一個字符串,你會做這樣的事情:

test_name = 'joe' 
eval "def test 
    puts '#{test_name}' 
end" 

test 
+1

可以工作,這取決於OP想要什麼。顯然他會在某處插入某些東西,否則,爲什麼要使用'eval'? – Matchu 2010-06-08 04:17:55

+0

我正在嘗試讀取存儲在數據庫中的方法,然後使用參數執行它。 – Nick 2010-06-08 16:39:55

+0

在讀入之前,你知道參數是和它們的順序嗎?如果是這樣,那麼使用eval與字符串應該工作。 – scottd 2010-06-08 17:07:02

7

如果要動態申報的方法,然後更好的方式來做到這一點是使用define_method代替的eval,像這樣

define_method(:test) do |name| 
    name 
end 

test 'joe' 
#=> joe 

除非絕對必要,否則不要使用eval,並且您有120%確定它是安全的。即使你120%確定它是安全的,仍然嘗試尋找其他選項,如果你找到一個,然後使用它,而不是eval。

相關問題