我想创建一个函数,所以每次调用它时都会返回一个从1开始递增1的值。
我想它可以用全局变量制作,但不是一个漂亮的解决方案。
答案 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