2009-04-20 79 views
1

我在業餘時間學習Ruby,我對常量的語言結構有一個疑問。 Ruby是否具有C++ const關鍵字的等價物以防止變量被修改?下面是一些示例代碼:C++常量的Ruby等價物?

first_line = f.gets().chomp() 
column_count = first_line.split(%r{\s+}).size() 
print column_count, "\n" 

我想申報COLUMN_COUNT爲const,因爲我在下面的程序使用它,我真的不希望錯誤地修改它。 Ruby是否爲此提供了一種語言結構,或者我應該吸取它並意識到我的變量總是可變的?

迴應評論:

「的變量是,我猜,長的代碼塊‘意外’改寫的最可能的原因。」我同意你的觀點精神,但不同意這封信。關於避免長塊代碼和不必要狀態的觀點是很好的一點,但對於常量,在描述實現內部代碼設計時也很有用。在我的代碼中const值的很大一部分來自於註釋哪些變量我應該改變,哪些不應該改變,這樣我就不會在下一年回到我的代碼中時嘗試改變它們。這是一樣的情緒,表明使用簡短註釋的代碼由於具有良好的變量名稱和明確的縮進比使用詳細註釋解釋的笨拙代碼更好。

另一種選擇似乎是Ruby的#freeze方法,我喜歡它的外觀。感謝大家的回覆。

+0

快速谷歌揭示http://rubylearning.com/satishtalim/ruby_constants.html – cobbal 2009-04-20 05:03:49

回答

3

以大寫字母開頭的變量在Ruby中是常量。所以,你可以更改您的代碼如下:

first_line = f.gets().chomp() 
Column_count = first_line.split(%r{\s+}).size() 
print Column_count, "\n" 

現在,如果你嘗試修改Column_count,你會得到一個警告。

+0

這很酷。有沒有辦法讓這個警告出錯? – 2009-04-20 05:07:18

+0

約定是使常量全部大寫,所以在這種情況下,COLUMN_COUNT。 – 2009-04-20 05:22:20

+1

這不會阻止您更改分配給Column_count的對象。您仍然可以修改對象的內部狀態。爲了防止這種情況,請使用#freeze。 – rampion 2009-04-20 13:02:58

4

紅寶石變量總的來說是可變的。

除了傑里米的回答,雖然完全準確,但並不會引導您使用非常「主流」或慣用的聲音,我不推薦採用它。 Ruby不能像C++那樣工作,並且通常不適合C++最適合的東西。操作系統,文字處理器,那種事情。

「意外」覆蓋變量的最可能原因是,我猜測,長塊代碼。畢竟,如果你用五行方法改變一個變量的值,這將是相當明顯的!如果您習慣性地編寫比10行更長的代碼塊,那麼這些塊可能做了太多事情,我強烈建議您努力將其分解(增加cohesion)。儘可能地對變量進行本地化,以儘量減少意外副作用的機會(減少coupling)。

4

按照慣例,ruby中的常量通常寫在所有大寫字母上,如COLUMN_COUNT。但正如所指出的那樣,所有以大寫字母開頭的變量都是常量。