2016-12-01 32 views
0

クラスに追加するには、いくつかの定数を持っているこの方法を記述するためのプロトコルであると思わ:ルビのクラスで定数が推奨されないのはなぜですか?

module AddressValidator 
    FIELD_NAMES = [:street, :city, :region, :postal_code, :country] 
    VALID_VALUE = /^[A-Za-z0-9\.\# ]+$/ 
    class << self 
    ... 
    end 
end 

クラスの定数を追加することも動作しますが、それは推奨されない理由は?

class AddressValidator 
    FIELD_NAMES = [:street, :city, :region, :postal_code, :country] 
    VALID_VALUE = /^[A-Za-z0-9\.\# ]+$/ 

    ... 
end 
+0

どこですか? –

+1

誰があなたにそのようなルールが存在すると言ったのですか? – spickermann

+0

最初の例ではクラスを作成せず、モジュールを作成します。 – Stefan

答えて

2

あなたはちょっと混乱しているかもしれないと思います。

最初の例では、クラスを作成しません。

class << self 

これは、(あなたの例の場合、AddressValidatorに)スコープに現在のオブジェクトのシングルトンクラスを開くための表記法です。

これは、AddressValidator.newを呼び出し、AddressValidatorインスタンスを取得しないで、NoMethodErrorを呼び出すことでテストできます。

あなたが聞いたことがあるかもしれないと思うのは、モジュールを標準的な方法として使用するという名前の定数定数です。

このようなモジュールを使用して名前空間と分けたい定数の束がある場合は、クラスを使用するよりも優れています。基本的には、そのクラスのインスタンスを作成する場合にのみ、ネームスペースとクラス用のモジュールを使用することです。

+0

詳細な回答をいただきありがとうございます。最初の例では、 'AddressValidator.a_method'のように' class << self'の内部で定義されたメソッドを呼び出すことができます。だから私は混乱して、クラスを作成すると思った。しかし実際にはインスタンスを作成できないためではありません。 – Leo

関連する問題