2015-11-30 9 views
10

クラスメソッドとクラスビヘイビアを追加する方法を知っていますusing self << class (eigenclass)。この作業を行う方法クラス<<内部でクラス定義は何をしますか?

class LetterAvatar 
    class << self 
    class Identity 
    end 
    end 
end 

some source codeを読むときしかし、私は別の使用を見ましたか?それは何をし、いつそれを使うべきですか?これを書くにはどうすればよいでしょうか?

+3

これは 'LetterAvatar :: Identity'リファレンスによって外部からアクセスできないプライベート定数を持つ方法です。 –

答えて

3

他の場所ではこのクラスが必要ないため、彼らはそうしたと思います。

シングルトンクラスを開くことなく流れが(self.接頭辞される元のコードからメタクラスで定義されたすべての方法と仮定して)以下のようになります

彼らはIdentity

として
class LetterAvatar 
    class Identity 
    end 
end 

を定義している可能性が

class LetterAvatar 
    # code omitted 
    def self.generate 
    identity = LetterAvatar::Identity.from_username(username) 
    # code omitted 
    end 
    # other class level methods defined with `self.` 
end 

ただし、次のように、self.generateメソッドのクラスを使用します。もしIdentityクラスがシングルトンクラス(generate)の中で実際にしか使われていない(そして他の場所にアクセスする必要はない)ならば?

解決策は非常にエレガントですが、前にこのようなことは何も見たことがありません。

+0

明らかに、他のクラスを使用します(https://github.com/discourse/discourse/blob/d41a8a21cc76fb50c0121942e7c04a1e8c34ffaa/app/controllers/user_avatars_controller.rb#L34)。だから、おそらく私的ではない、そうでなければ、そのように考えるべきだが、施行されていない。 – berkes

+0

私の以前のコマンドは誤りでした。談話user_avatars_controller *はこれを使用しますが、コードはおそらく使用されていないか、または上書きされている可能性があります。 – berkes

関連する問題