如何将Ruby局部变量从方法传递给子方法?

myb*_*ael 3 ruby variables

鉴于这个简单的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变量传递给子方法而不必强制使用类变量?

sep*_*p2k 8

你拥有的代码,很可能不会做你想要的:

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)


Jör*_*tag 5

在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)