2011-11-22 64 views
2

已經在Ruby中工作了一段時間,但通常在Rails的上下文中。我現在使用它來做一些部署腳本,並且我發現自己正在尋找一個不可變的不可變引用。Ruby中是否有'const指針'?

在C++中,我有(我已經很多年沒有碰到C++,所以大家多多包涵)

const int x = 5; 
const int * const i = &x; 

這會給我一個變量,它會永遠指向我〜5我正在尋找一種方法來防止重新定義我。

在Ruby中,我有

i = 5.freeze 

覆蓋第一常量,而不是第二。

i = 5 
i = 6 # ideally generates an error or warning 

這主要是爲了幫助程序防禦。任何類似的東西?

(是的,這個問題的根源是,我的劇本已經長得太大,需要在主要的方式進行重構,這是對積壓。)

回答

1

Ruby的"constants"生成警告時重新分配。而且,以確保現有的值不被突變,你可以凍結其價值(像你一樣),或者簡單地用一個不變的價值就像一個符號:

C:\>cat constant_reassignment.rb 
FOO = :foo # Symbols are immutable, and a good choice for a sigil 
FOO = :bar 

C:\>ruby constant_reassignment.rb 
constant_reassignment.rb:2: warning: already initialized constant FOO 

如果您需要以編程方式定義的值你可以在您選擇的類/模塊使用const_set

class Foo; end 
p Foo.const_defined? "BAR" #=> false 
p Foo::BAR rescue nil # Would be NameError: uninitialized constant Foo::BAR 

Foo.const_set "BAR", 42 
p Foo::BAR #=> 42 

Foo.const_set "BAR", 17 
#=> warning: already initialized constant BAR 

如果你想有一個硬錯誤引發的,我建議你應該創建定義這些爲你的方法和raise如果const_defined?顯示已經存在這樣的值。

+0

我使用它在運行時生成/返回的值,但不是預先知道的值。這感覺真的很不自然。這可能是唯一的方法。它只會讓我的代碼看起來「不太好」。 –

+0

@JohnHinnegan我編輯了我的答案,以顯示如何動態定義一個常量,並在已經定義的情況下得到警告。 – Phrogz