2010-06-08 2 views
4

Я пытаюсь передать переменную динамически заявленным способом, как:Могу ли я передавать переменные в eval?

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

, но он не работает.

Есть ли способ сделать это?

+1

Я действительно очень смущен относительно того, что вы пытаетесь сделать. 'eval' не является инструментом для этой работы. Как насчет 'define_method'? – Matchu

ответ

9

eval ожидает строку. Следующие должны работать нормально:

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

Спасибо, что напомнил Брайана. Оно работает. Не знаю, почему я пропустил это. – Nick

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

+0

Я пытался прочитать метод, хранящийся в базе данных, а затем выполнить его с параметрами. – Nick

+0

Знаете ли вы, что параметры и их порядок, прежде чем вы его прочитали? Если это так, то использование eval со строкой должно работать. – scottd

7

Если вы хотите объявить метод динамически, то лучший способ сделать это состоит в использовании define_method вместо Eval, как и

define_method(:test) do |name| 
    name 
end 

test 'joe' 
#=> joe 

Не используйте eval, если это абсолютно необходимо, и вы на 120% уверены, что это безопасно. Даже если вы на 120% уверены, что он в безопасности, по-прежнему пытайтесь найти другие варианты, и если вы найдете его, то используйте вместо eval.