2010-06-08 68 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。

相关问题