В Ruby только блоки (и лямбда-литералы) могут быть замыканиями.Таким образом, вам придется использовать блок для определения метода:
def testMethod
testVar = 1
Object.send(:define_method, :subTestMethod) do
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestMethod
end
testMethod
Как уже указывали другие, то, делает ли это то, что, по вашему мнению, делает, зависит, конечно, от того, что именно вы думаете, что это так, но, скорее всего, это не .
Просто пара советов по стилю: методы и (непостоянные) переменные следуют за snake_case
именованиемПо соглашению, вы используете пустые строки, чтобы отделить инициализацию от фактической работы и возвращаемого значения, и все это выражение.
Итак, ваши testMethod
, subTestMethod
и testVar
должны быть скорее названы test_method
, sub_test_method
и test_var
.До define_method
и до sub_test_method
должна быть пустая строка.И вы можете вытянуть puts
за пределы выражения if
, так как оно равно выражению и, таким образом, возвращает его значение:
def test_method
test_var = 1
Object.send(:define_method, :sub_test_method) do
puts(if test_var == 1 then 'Yes' else 'No' end)
end
sub_test_method
end
test_method
То, что вы, вероятно, скорее всего, хотите, это лямбда:
def test_method
test_var = 1
sub_test_lambda = -> { puts(if test_var == 1 then 'Yes' else 'No' end) }
sub_test_lambda.()
end
test_method