2012-07-25 56 views
2

我正在學習ruby,我發現ruby常量必須以大寫字母(例如Myconstant)開頭。這將使它成爲一個常數,但它的價值是可變的!爲什麼ruby常量是可變的?變量有什麼區別?

如果一個常量的值是可變的,那麼爲什麼我們需要常量,那麼變量之間有什麼區別呢?

回答

2

常量的詞彙範圍,而方法具有動態作用域:

class Super 
    Constant = "Super::Constant" 

    def method 
    'Super#method' 
    end 

    def get_constant 
    Constant 
    end 

    def get_method 
    method 
    end 
end 

class Sub < Super 
    Constant = 'Sub::Constant' 

    def method 
    'Sub#method' 
    end 
end 

Super.new.get_constant # => "Super::Constant" 
Sub.new.get_constant # => "Super::Constant" 

Super.new.get_method # => "Super#method" 
Sub.new.get_method # => "Sub#method" 

並儘可能變量,他們從外面無法進入。你打算如何訪問這些?

class Object 
    Constant  = 'constant' 
    local_var  = 'local var' 
    @instance_var = 'instance var' 
    @@class_var = 'class var' # btw, never use these 
end 

此外,還有很多事情你可以紅寶石做,而是爲你自己的理智,就要小心了。我建議不要改變常量,這可能會讓你的團隊感到沮喪。

+0

感謝您的簡單解釋。有什麼理由不斷改變?如果它是可變的,那麼爲什麼稱它爲一個常量(名稱不明確)? – 18bytes 2012-07-25 06:42:40

+0

我想不出一個特別好的,但我也想不出一個理由讓它變成你不能改變它們。一般來說,它們是常量,因爲這就是我們對待它們的方式,而且它們的行爲方式是假設的。但是如果你在需要破解某些東西的情況下解決了問題,那麼讓語言阻止你會有多沮喪? – 2012-07-25 06:58:15

2

Ruby可以讓你在腳下拍攝自己(如果你真的想的話)。但是,至少在這種情況下,它會警告你。

ONE = 'one' 
ONE = 'two' # !> already initialized constant ONE 
2

一些原因:

1)公約。從標識符的名稱很容易看出它不應該改變。

2)技術。它(可能;比我更有見識的人可能會回答)讓翻譯更簡單。

3)動態有時是有幫助的;在測試中,例如,有可能重新定義的東西用於測試目的,而不必存根/代理一切......

1

我有時候會使用這個特性來測試代碼而沒有其他必要的參數,例如,當我從我的編輯器中難以提供參數的腳本運行腳本時。

#ARGV[0] = "c:/test.txt" #in case of testing i remove the first remark sign