ruby - 如何在 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
?有哪些选择,它们的缺点/优点是什么?
解决方案
使用实例变量
您可以将 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 作为参数显式传递。如果将其存储为变量,实例变量、类变量或类/模块常量的选择将取决于多种因素,但实例变量通常是正确的通用选择。
推荐阅读
- ajax - RequestBody 注释在 Liferay 7 Spring MVC Portlet 中不起作用
- php - 错误:您的要求无法解析为一组可安装的软件包
- javascript - 如何在elasticsearch中合并范围和多匹配查询
- python - 如何从 django 视图运行功能测试?
- reactjs - Laravel 加 Reactjs 服务端渲染加 Less 和 ant 设计
- travis-ci - 使用 Boxfuse 配置 Travis CI 时是否需要加密 BOXFUSE_SECRET?
- java - Eclipse RCP 4.10 Workbench 本地文件历史
- javascript - 在应用不透明度之前,传单重叠多边形合并
- deployment - IBM Data Studio 4.1.3 的静默安装问题
- node.js - 在数据库查询期间检查错误并在 express 的异步调用中返回它