鉴于这个简单的Ruby代码:
def testMethod
testVar = 1
def subTestMethod
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestMethod
end
testMethod
Run Code Online (Sandbox Code Playgroud)
有没有办法将局部testVar变量传递给子方法而不必强制使用类变量?
你拥有的代码,很可能不会做你想要的:
def代码中的内部没有定义本地方法.相反,它定义了subTextMethod作为一个全球性的方法Object,一旦类testMethod被称为首次.这意味着在您调用testMethod之后,您将能够subTestMethod从任何地方进行调用.
当然,这subTestMethod不是本地的事实testMethod也意味着subTestMethod不能关闭testMethod局部变量.
要获得所需的行为,您可能希望使用这样的lambda(或重新考虑您的设计,以便您不需要任何嵌套函数):
def testMethod
testVar = 1
subTestLambda = lambda do
if testVar == 1
puts 'Yes'
else
puts 'No'
end
end
subTestLambda.call
end
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
正如其他人已经指出,此事件是否做了什么,你认为它当然取决于究竟是什么,你想这样做,但最有可能的,它没有.
只有几个样式提示:方法和(非常量)变量遵循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
Run Code Online (Sandbox Code Playgroud)
你可能更想要的是一个lambda:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1395 次 |
| 最近记录: |