2017-04-13 80 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命名空間? –