2016-10-20 108 views
4

ほとんどのJavaのenumはインターネット上で言及されていますが、enumはすべて大文字である必要があります(例:ACTIVE)。Railsの列挙型:大文字か小文字か

ここのように:Coding Conventions - Naming Enums

しかし、それはRailsのに来るとき、彼らは小文字の列挙型の値を使用するすべてのそこの例とドキュメント(例:「アクティブ」)で、ここのように:以来、理にかなってhttp://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html

また、これらの列挙型の名前でインスタンスメソッドを提供します(例:obj.active?)。これは、Railsの列挙型が小文字として使用されているか、それ以上の理由があるのか​​? また、enumを小文字で使用する場合の規約とは異なります。あるいは大文字の列挙型をRailsでも使用するのでしょうか?

だから、例えば私は大会ごとにアクティブドラフトまたは非アクティブのいずれかであることができる私のモデルでstatus列挙型を、持っている、それは次のようになります。

enum status: {active: 1, draft: 2, inactive: 3} 

か:

enum status: {ACTIVE: 1, DRAFT: 2, INACTIVE: 3} 

どの理由がありますか?

+1

いくつかの例にリンクできますか? –

+0

私は大文字をまだ使用していませんが、大文字の列挙型を作成する前に、「アクティブ」やメソッドを「obj.Active?」のように作成しました。 – Sajan

+0

そこで、例を追加しました。また、はいobj.Active?うまくいくでしょうか、obj.ACTIVEですか?とobj.active?大会が何であるか知りたかっただけです。 RAILSの場合とまったく同じですが、JAVAのものと異なる場合は、一般的なコーディング規則に従わないのはなぜですか。 –

答えて

6

列の列挙型はsnake_caseである必要があります。

なぜですか? enumはメソッド名を構築するために使用されるためです。そして、Rubyのメソッド名はsnake_caseaccording to the community conventionでなければなりません。 ALLCAPSまたはCamelCaseを使用すると、Rubyがそのような識別子を定数として扱うため、バグや混乱を招く可能性があります。

ActiveRecord::Enumは、Javaなどの言語レベルの列挙体に匹敵しません。

は、値が データベース内の整数にマップのenum属性を宣言しますが、名前で照会することができます。
http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

のActiveRecord ::列挙型のキーマッピングは定数ではありません。むしろそれは、ビットマスクの列をより簡単に(そしてより楽しく)動作させるためのメソッドを追加するRubyスタイルのメタプログラミングで使用される単なるリストです。あなたの例では

にその実際に匹敵する:

enum status: [ :ACTIVE, :DRAFT, :INACTIVE ] 

列挙型は、定義済みの定数の 設定する変数のために有効に特殊なデータ型です。変数は、あらかじめ定義されている値のうち、 のいずれかに等しくなければなりません。一般的な例には、 コンパスの指示(NORTH、SOUTH、EAST、WESTの値)と 曜日が含まれます。
https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html

Javaで列挙型は、基本的には、クラス定数が可能な値を示す見せかけswitch文です。

6

これは、これらの列挙型の名前(例:obj.active?)でインスタンスメソッドを提供するので意味があります。これがRAILSの列挙型が小文字として使用される唯一の理由ですか?

主な理由はそうですね。ルビーでは、obj.Active?obj.ACTIVE?のようなメソッドを持つのは非常にユニダイマです。それ以上の理由は必要ありません。 :)

+0

まさに、このように最初に作成したとき、このようなメソッド名を持つことはかなりうまく感じられました。 – Sajan

+1

"' obj.Active? 'のようなメソッドを持つことは、ルビでは非常に独立しています.-' Kernel#Integer() 'とファミリについては何ですか? – mudasobwa

+2

@ mudasobwa私は_誰かがこれをポップアップするだろう。 :)変換方法です。クラス名と同じ名前をつけてください。通常の方法とは非常に異なる(意図的に)。 –

関連する問題