Ruby中的静态变量使“一个计数器功能”?

时间:2017-04-13 21:08:14

标签: ruby algorithm

我想创建一个函数,所以每次调用它时都会返回一个从1开始递增1的值。

我想它可以用全局变量制作,但不是一个漂亮的解决方案。

2 个答案:

答案 0 :(得分:3)

我可能会这样做:

class EverreadyBunnyCounter
  def initialize
    @counter = 0
  end

  def current
    @counter
  end

  def next
    @counter += 1
  end
end

foo = EverreadyBunnyCounter.new
bar = EverreadyBunnyCounter.new
foo.next # => 1
bar.next # => 1
foo.next # => 2
bar.current # => 1

current方法不是必需的,但有时可以方便地查看当前值而不强制它增加。

或者,这可能会这样做:

MAX_INT = (2**(0.size * 8 -2) -1)
counter = (1..MAX_INT).to_enum # => #<Enumerator: 1..4611686018427387903:each>
foo = counter.dup
bar = counter.dup
foo.next # => 1
foo.next # => 2
bar.next # => 1
bar.next # => 2
foo.next # => 3

以这种方式定义MAX_INT来自“Ruby max integer”。缺点是,由于用于创建枚举器的范围,您最终会耗尽值,其中使用EverreadyBunnyCounter类的先前版本将继续运行。

MAX_INT更改为Float::INFINITY可以解决这个问题:

counter = (1..Float::INFINITY).to_enum # => #<Enumerator: 1..Infinity:each>
foo = counter.dup
bar = counter.dup
foo.next # => 1
foo.next # => 2
bar.next # => 1
bar.next # => 2
foo.next # => 3

Enumerator documentation有更多信息。

答案 1 :(得分:2)

这样的东西?

def incr
  @n ||= 0 
  @n += 1
end

incr
#=> 1
incr
#=> 2