假设有以下简单的Ruby代码:
def testMethod
testVar = 1
def subTestMethod
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestMethod
end
testMethod
有没有办法在不强制使用类变量的情况下将本地变量 testVar
传递给子方法?
def testMethod
testVar = 1
subTestLambda = lambda do
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestLambda.call
end
在Ruby中,只有块(和lambda字面量)可以是闭包。因此,您需要使用块来定义方法:
def testMethod
testVar = 1
Object.send(:define_method, :subTestMethod) do
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestMethod
end
testMethod
正如其他人已经指出的那样,它是否能实现你想要的功能当然取决于你认为它做什么,但很可能它不会。
只是一些风格提示:方法和(非常量)变量遵循蛇形命名法,您使用空行将初始化与实际工作和返回值分开,并且所有内容都是表达式。
因此,您的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
testVar
作为参数传递给subTestMethod
函数。def testMethod
testVar = 1
def subTestMethod(testVar)
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestMethod testVar
end
subTestMethod
定义为“全局”方法,而不是像在Python中那样定义为本地函数。 - sepp2kdef
将定义一个名为subTestMethod
的新方法,可以像调用testMethod
一样调用它。 - Chandra Patni