首页 > 解决方案 > 如何在 Ruby 中的所有方法之间共享 lambda 函数?

问题描述

我有一个像这样的 lambda:

class MyClass
   def test
      to_cross = lambda do |m, x| # Just a dummy example
        return m * x
      end
      
      to_cross.call(7, 9)
   end
   
   def another_method
      to_cross = lambda do |m, x| # Just a dummy example
        return m * x
      end
   
      to_cross.call(2, 5)
   end
end

但是,我想在该类的所有方法中使用这个 lambda。我怎样才能使它在全班范围内?

我试过这样的事情:

class MyClass

   # Define in class
   to_cross = lambda do |m, x| # Just a dummy example
     return m * x
   end

   def test
      to_cross.call(2, 5)
   end

   def another_method
      to_cross.call(2, 5)
   end
end

我有:

undefined local variable or method `to_cross' for #<MyClass:0x0000564193f4e748>

我有哪些选择?如何在 中的所有方法中使用此 lambda MyClass?有哪些选择,它们的缺点/优点是什么?

标签: rubylambda

解决方案


使用实例变量

您可以将 Proc 或 lambda 存储为实例变量。然后,您可以从类中的任何方法访问该变量。例如:

class MyClass
   def initialize
     # make the lambda accessible throughout the
     # class as an instance variable
     @to_cross = ->(m, x) { m * x }
   end

   def test
     @to_cross.call 7, 9
   end

   def another_method
     @to_cross.call 2, 5
   end
end

klass = MyClass.new
klass.test            #=> 63
klass.another_method  #=> 10

要点是将 lambda 存储在一个范围内,使其可以从您的实例或类中的其他方法访问,或者将 lambda 作为参数显式传递。如果将其存储为变量,实例变量、类变量或类/模块常量的选择将取决于多种因素,但实例变量通常是正确的通用选择。


推荐阅读