我想要一个在Ruby中保持本地状态的函数.每次我调用该函数时,我想返回一个结果,该结果既依赖于调用参数又依赖于函数的存储状态.这是一个简单的例子:
def inc_mult(factor)
@state ||= 0 # initialize the state the first time.
@state += 1 # adjust the internal state.
factor * @state
end
Run Code Online (Sandbox Code Playgroud)
请注意,状态是第一次初始化,但后续调用访问存储状态.这很好,除了@state泄漏到周围的环境中,我不想要.
什么是最优雅的重写方式,以便@state不泄漏?
(注意:我的实际例子要复杂得多,初始化状态很昂贵.)
您可能希望封装inc_mult到它自己的类中,因为您希望将其状态与其包含对象分开封装。这就是生成器(yield语句)在 Python 和 C# 中的工作方式。
像这样简单的事情就可以做到:
\n\nclass Foo \n state = 0 \n define_method(:[]) do |factor|\n state += 1\n factor * state\n end \nend\nRun Code Online (Sandbox Code Playgroud)\n\n从哲学上讲,我认为您\xe2\x80\x99的目标与Ruby\xe2\x80\x99将方法视为消息的观点不兼容,而不是作为可以独立的函数。
\n| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |