2017-04-13 81 views
0

我想做一个函数,所以每次它被称为它返回一个值从1开始加1。Ruby中的静态变量能够实现“一个加计数器功能”?

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

+0

请阅读“[问]”,包括链接页面,“[mcve]”和“[Stack Overflow用户需要多少研究工作?](http://meta.stackoverflow.com/questions/261592) ”。我们希望看到你的努力的证据。你尝试了什么?你搜索并没有找到任何东西?你有没有找到东西,但它没有帮助?你有没有尝试写代码?如果不是,为什么?如果是这样,那么最小的代码示例显示了您尝试的内容以及它为什么不起作用?没有它,看起来你没有尝试并希望我们为你写信。 –

回答

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_INTFloat::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有更多的信息。

2

是这样的吗?

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

incr 
#=> 1 
incr 
#=> 2 
+0

我来自Python,并试图了解一点关于Ruby,所以忍受我,但这个clobbers对象名称空间,不是?可能有一个闭包的方法有点“更清洁”:[原谅我敢肯定的是可怕的单一代码](https://repl.it/HJCe/1) –

+1

为什么会打开Object命名空间? –