我可以将变量传递给eval吗?

时间:2010-06-08 04:04:29

标签: ruby

我试图将变量传递给动态声明的方法,如:

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

但它不起作用。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:10)

eval需要一个字符串。以下应该可以正常工作:

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

答案 1 :(得分:7)

如果你想动态声明一个方法,那么更好的方法是使用define_method而不是eval,就像这样

define_method(:test) do |name|
  name
end

test 'joe'
#=> joe

除非绝对必要,否则不要使用eval,并且120%确定它是安全的。即使你确定它是安全的120%,仍然会尝试寻找其他选项,如果你找到一个,那么使用它而不是eval。

答案 2 :(得分:0)

我对你要做的事感到有点困惑。如果您尝试使用eval定义一个方法,可以在此处获取参数,例如:

eval "def test(name)
  puts name
end"

test 'joe'

如果你想使用eval定义一个更动态的方法并使用一个变量,因为正如Brian指出eval需要一个字符串,你会做这样的事情:

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

test