2011-04-30 43 views
2

我還在學習Ruby,我很好奇在這種情況下使用類變量,常量還是局部變量是否合適。我想在這裏使用什麼樣的Ruby變量?

在我的下面的代碼示例(從固定字符集中生成隨機用戶名)中,將@username作爲實例變量分配很明顯。但我很好奇我是否應該將字符集分配爲常量或可能是類變量。在這種情況下使用另一種變量類型有什麼好處?

在當前示例中,_charset是在每個實例中計算的。 (如果我的假設錯誤,請糾正我)。我還假定計算將作爲類變量和常量在實例之間共享(而不是重新計算)?

class NewAccount 

    def initialize 
    @username = self.generate_username 
    end 

    def generate_username 
    _charset = ('a'..'z').to_a + ('0'..'9').to_a 
    _newusername = Array.new(20) { _charset[rand(_charset.length)] }.join 
    return _newusername 
    end 

end 
+3

請注意,a)使用具有前導下劃線的_variables和b)顯式返回是方法的最後一個表達式,不是慣用的Ruby。另外,您可以將該行寫爲:new_username = 20.times.map {charset.choice} .join – tokland 2011-04-30 20:14:19

+1

另一種創建用戶名的方法是:@username = rand(36 ** 20).to_s(36) – steenslag 2011-04-30 21:55:09

回答

2

因爲_charset = ('a'..'z').to_a + ('0'..'9').to_a從來沒有從它的定義的變化,我想創建它作爲一個類常量:

class NewAccount 

    CHARSET = ('a'..'z').to_a + ('0'..'9').to_a 

    def initialize 
    @username = self.generate_username 
    end 

    def generate_username 
    _newusername = Array.new(20) { CHARSET[rand(CHARSET.length)] }.join 
    return _newusername 
    end 

end 
1

我想你可以把它類變量作爲_CHARSET會在NewAccount類只和它的價值不會爲NewAccount的實例中更改使用。

3

你可以把它變成一個類變量或常量,實際上這是相同的:只有一個實例存在。而Ruby常量並不是真正的常量 - 你可以改變一個常量,所以它是一個真正的變量,只是因爲它的名字Ruby識別出一個常量並且在你嘗試改變它時發出一個警告。

但是通過聲明它爲一個常量而不是類變量,您正在記錄您的目標:具有一個由字符集組成的常量值,該值不會被更改。對於閱讀代碼的人來說,這是顯而易見的。這就是你想要的字符集 - 這樣做。

如果你把它變成一個類變量,它將是一個變量:如果有人試圖改變,那麼沒問題。當然,如果你打算改變它的價值,不管是什麼原因,都要做一個類變量:再次,你將記錄你的設計。

1

在您的示例@username會爲每個實例來計算一次,並只_CHARSET在計算一次你的例子 - 但_charset只是一個局部變量,所以如果你運行該方法兩次,它將被重新計算。

你想要的是什麼錫文建議,將其設置爲常量並計算一次。使用類變量(@@ charset)可能會引起誤解,因爲字符集不會在任何時候改變。

相關問題