9

Ruby でクラスが継承されると、シングルトン クラスも継承されます。

class A
  def self.hello
    puts "hello"
  end
end

class B < A
end

B.hello #=> "hello"

ただし、モジュールの場合はそうではありません。

module M
  def self.goodbye
    puts "goodbye"
  end
end

class A
  include M
end

A.goodbye #=> NameError

この制限を回避するために、多くの人がこの醜いハックに頼っています。

module M
  def self.included(c)
    c.extend ClassMethods
  end

  module ClassMethods
    def goodbye
      puts "goodbye"
    end
  end
end

わかりましたので、私の質問: モジュールに対するこの制限の背後にある理論的/概念的な理由はありますか? それとも単に実装上の問題でしたか?

C ソース コード (YARV/MRI) を見た後、実装上の問題があることを確認できます (克服できないわけではありませんが、すべて同じです)。しかし、これが唯一の理由ですか? この制限の他の理由はありますか?

ありがとう

4

2 に答える 2

1

誰も説得力のある議論を思いつくことができない限り、制限は実装の難しさにかかっていると感じています。それにもかかわらず、私はここ数日問題に取り組んでおり、(ベータ版で)include_completeこれらの問題を回避し、モジュールの継承がクラスの継承のように機能するようにする(シングルトンを導入する)インクルードの新しいバージョンを呼び出しました。

ここでプロジェクトをチェックしてください: http://github.com/banister/include_complete

プロジェクトはまだベータ版ですが、これまでのところ期待どおりに機能しているように見えることに注意してください

于 2010-10-04T03:53:22.933 に答える
0

警告: 以下は単なる憶測です。

クラスを使用している場合は、シングルトン クラス メソッドが必要になります。これは、オブジェクトの作成にシングルトン クラス メソッドに依存しているためです (例: MyClass.new)。モジュールを使用している場合、純粋にモジュールからオブジェクトを作成することはできないため、それらは必要ありません。

于 2010-10-03T10:09:34.227 に答える