5

具体的な例(Rails)で質問します。「Javascriptなしで破棄(改訂)」レールキャストで、RyanBatesは#resourcesルーティング方法を上書きします。

module DeleteResourceRoute
  def resources(*args, &block)
    super(*args) do
      # some code
    end
  end
end

ActionDispatch::Routing::Mapper.send(:include, DeleteResourceRoute)

しかし、Rubyの継承は、モジュールが「スーパークラス」であるようには機能しません。では、彼はどのように#superしてモジュールから呼び出すことができますか?

このようなメソッドを上書きすることが可能である場合、これを行う代わりに人々は:

class SomeClass
  alias old_method method
  def method
    # ...
    old_method
    # ...
  end
end

これで何かをしている可能性があります:

class SomeClass
  include Module.new {
    def method
      # ...
      super
      # ...
    end
  }
end

私は何が欠けていますか?

4

2 に答える 2

4

「スーパー」は「クラス」コンテキストにのみ存在します。super は「純粋なモジュール」コンテキストでは生きられませんでした。そのため、次のようなコードを見たとき:

module DeleteResourceRoute
  def resources(*args, &block)
    super(*args) do
      # some code
    end
  end
end

「このモジュールを含める」クラスが必要です。その後、「スーパー」が有効になります。

class SomeClass extends BaseClass
  include DeleteResourceRoute
end

class BaseClass
  def resources
    puts "called parent!"
  end
end

SomeClass.new.resources  # => called parent!
于 2012-10-14T22:46:28.093 に答える
3

私はそれを考え出した。に含まれるモジュールがありActionDispatch::Routing::Mapper、そのモジュールは#resourcesメソッドを保持します。#resourcesがモジュールではなく で直接定義されている場合ActionDispatch::Routing::Mapper、上書きしてもこの方法では機能しません (代わりに「エイリアス」メソッドを使用する必要があります)。

モジュールとクラス全般について言えば、モジュールはそれを含むクラスのスーパークラスのように機能します。「スーパークラスのように振る舞う」とは#foo、モジュールで定義されたメソッドがあり、そのモジュールをクラスに含める場合、そのクラスはメソッドを上書きして#fooを呼び出すことができ#super、それがモジュールの#fooメソッドを呼び出すことを意味します。例:

module Foo
  def foo
    puts "foo"
  end
end

class Bar
  include Foo

  def foo
    super
    puts "bar"
  end
end

Bar.new.foo
# foo
# bar
# => nil
于 2012-10-16T00:26:23.630 に答える