2011-04-01 4 views
13
class Foo 

    def self.one; 1 end 

    class << self 
    def two; 2 end 
    end 

end 
puts Foo.singleton_methods.inspect # => ["two", "one"] 

私は上記の方法で「1つ」と「2つ」は概念的に異なりますが、どのように見えるのか分かりません。 これらはどちらもシングルトンメソッドです。概念とアプリケーションの違いは何ですか?ルビーのself.methodとクラス<< selfのメソッドの違いは何ですか?

+1

+1。 'module_function'はどうでしょうか?私はそれとの違いを知ることにも興味があります。 – sawa

答えて

7

適用上、違いはありません。概念的には、その違いは微妙ですが、最初のケースでは、現在のコンテキストで操作していて、別のクラスインスタンス(実際にはEigenclassのインスタンスメソッド)でメソッドを定義していますが、2番目のケースでは、他のクラスインスタンスのメタクラス( "Eigenclass")のコンテキスト、そしてインスタンスメソッドの定義

編集:以上、いくつかのクラスのメソッドを定義するとき

私は...いくつかのケースでclass << selfを選んだ理由であることを

  1. クリーナー構文を追加する必要があります。
  2. def my_method ...のほかに、Eigenclassコンテキストで他の種類のコードを実行することができます。例えば、そのコードブロックにattr_accessor :some_attributeと言うことができます。
4

"メタプログラミングのRuby"を強くお勧めします。 このマニュアルでは、シングルトンメソッドとシングルトンクラスを含むRubyのオブジェクトモデルについて説明します。

http://pragprog.com/titles/ppmetr/metaprogramming-ruby

この資料では、同じトピックについて説明します。

http://www.contextualdevelopment.com/articles/2008/ruby-singleton

+1

私はrubyをメタプログラミングしてチェックアウトします。 – djburdick

+0

私は実際にあなたが送ったリンクから自分のコードスニペットを得ました。抜粋 "一部のオブジェクト指向言語では、インスタンスメソッドとクラスメソッド(静的メソッドとも呼ばれることもある)をサポートするクラス構造がありますが、Rubyはインスタンスメソッドのみをサポートしています。なぜ、シングルトンクラスのコースです。私には、self.methodが同じであると言っています。つまり、すべてシングルトンです。 – djburdick

+0

Rubyはインスタンスメソッドのみをサポートしていますが、クラスもクラスクラスのインスタンスです。インスタンス(クラスインスタンス、つまりクラスを含む)にメソッドを追加すると、インスタンスのクラスを実際には新しい匿名サブクラスに変更してから、そのサブクラスに新しいインスタンスメソッドを追加します。その匿名のサブクラスはしばしばEigenclassと呼ばれます。 –

関連する問題