web-dev-qa-db-ja.com

Rubyの定数またはクラス変数?

私はRubyで数か月間プログラミングを行っていますが、クラス変数に対して定数を使用するのが適切なのはいつか、またその逆も同様です。(私はRailsで作業しており、考えています。モデルの定数について)。

class Category
  TYPES = %w(listing event business).freeze
end

OR

class Category
  @@types = %w(listing event business).freeze
  cattr_reader :types
end

あるものが別のものよりも好ましい状況はありますか?それとも単に好み/スタイルの問題ですか?

47
Ben Crouse

重要なことは、CONSTANT表記を使用することで、読者にそれを明確にしているということです。小文字のフリーズされた文字列は、might設定可能であるという印象を与え、誰かが戻ってRDocを読むことを強制します。

56
Charlie Martin

これらがソースコードで定義した本当に定数の値であり、コードの実行中に変更したくない場合は、定数を使用することをお勧めします。

実行中にこれらの値を動的に設定および/または変更する場合は、ゲッターおよびセッターでクラス変数を使用してください。

11

基本的に、次のように表すことができます。定数が必要な場合は、定数を使用します。変数が必要な場合は、変数を使用してください。型のリストは固定された配列であるため、定数のように見えるので、この場合は定数を使用するのが理にかなっていると思います。

8
August Lilleaas

プログラムの実行中に値を変更したくない場合は、およびの外部から値にアクセスできるようにしてください。クラス、定数を使用します。

それ以外の場合は、クラス変数を使用できます。ただし、クラス変数はサブクラスとサブクラスのインスタンスの間で共有されることに注意してください。したがって、将来のある時点で子クラスを実装する可能性がある場合は、クラス変数の使用に十分注意する必要があります。

詳細については、こちらの回答を参照してください。 Rubyのクラス変数

2
awolfson

コンスタントをプライベートにしたい場合は、いつでも次のことができます。

FOO = 18
private_constant :FOO
1
berkos