Ruby:带参数的可恢复函数

Pet*_*ter 5 ruby

我想要一个在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不泄漏?

(注意:我的实际例子要复杂得多,初始化状态很昂贵.)

Jos*_*Lee 4

您可能希望封装inc_mult到它自己的类中,因为您希望将其状态与其包含对象分开封装。这就是生成器(yield语句)在 Python 和 C# 中的工作方式。

\n\n

像这样简单的事情就可以做到:

\n\n
class Foo \n  state = 0 \n  define_method(:[]) do |factor|\n    state += 1\n    factor * state\n  end \nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

从哲学上讲,我认为您\xe2\x80\x99的目标与Ruby\xe2\x80\x99将方法视为消息的观点不兼容,而不是作为可以独立的函数。

\n