В 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
Полезно знать. Спасибо. – mybuddymichael