2009-04-20 12 views
1

私は空き時間にRubyを学んでいます。定数の言語構成について質問があります。 Rubyには、変数の変更を抑えるためのC++のconstキーワードと同等のものがありますか?私は私のプログラムでは、以下のそれを使用して、私は本当に間違ってそれを変更したくないので、私はconstのようにCOLUMN_COUNTを宣言したいと思いますRubyに相当するC++ Const?

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

:ここではいくつかのサンプルコードです。 Rubyはこれを行うための言語構造を提供していますか?それとも私はそれを吸い上げて、変数が常に変更可能であることに気付かなければなりませんか?コメントへの

応答:

「変数の 『偶発』上書きの最も可能性の高い原因は、私は、コードの長いブロックを推測すると思います、です。」私はあなたの意見の精神に同意しますが、手紙に同意しません。長いコードブロックや不必要な状態を避けることについてのあなたの意見は良いことですが、定数は実装の内部でコードの設計を記述するのにも役立ちます。私のコードのconst値の大部分は、どの変数を変更すべきか、どの変数を変更すべきなのか注釈を付けることから来ます。そのため、来年のコードに戻っても変更したくないのです。これは、良い変数名と明確な字下げのために短いコメントを使用するコードが、詳細なコメントで説明された厄介なコードよりも優れていることを示唆している同じ感情です。

もう1つのオプションはRubyの#freezeメソッドであると思われますが、これも私の見た目が好きです。みんなに感謝します。

+0

クイックグーグルが明らかにhttp://rubylearning.com/satishtalim/ruby_constants.html – cobbal

答えて

3

大文字で始まる変数は、Rubyの定数です。だから、このようにコードを変更することができます:あなたはColumn_countを変更しようと

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

は今、あなたは警告を取得します。

+0

これはクールです。その警告をエラーにする方法はありますか? –

+0

コンベンションでは、定数をすべて大文字にするため、この場合はCOLUMN_COUNTになります。 –

+1

これは、どのオブジェクトがColumn_countに割り当てられているかを変更できないようにします。それでもオブジェクトの内部状態を変更できます。それを防ぐには#freezeを使用してください。 – rampion

4

ルビー変数は一般的には可変です。

Jeremyの答えを超えて、まったく正確ではありますが、Rubyのスタイルは非常に「主流」であり、慣用的に妥当ではありません。採用することをお勧めしません。 RubyはC++のようには動作しません。一般に、C++が最もよく使用されるものにはあまり適していません。オペレーティングシステム、ワードプロセッサ、そのようなもの。

変数の「偶発的」な上書きの原因として、長いコードブロックが考えられます。結局のところ、5行の方法で変数の値を変更すると、それはかなり明白になるでしょう!あなたが習慣的に10行以上のコードブロックを書いているのであれば、それらのチャンクはおそらくあまりにも多くのことをしているので、それらを分割するように努力することを強くお勧めします(増加するcohesion)。予期しない副作用の可能性を最小限に抑えるために、可能な限り変数をローカライズしてください(couplingを減らしてください)。

4

通常、ルビの定数は、COLUMN_COUNTなどのすべての大文字で書かれています。しかし、指摘したように、大文字で始まるすべての変数は定数です。