0
module Superpower

    # instance method
    def turn_invisible
        ...
    end

    # module method
    def Superpower.turn_into_toad
        ...
    end

    module Fly
        def flap_wings
            ...
        end
    end

end

Class Superman
    include Superpower
    ...

    def run_away
        # how to call flap_wings?
        # how to call turn_invisible?
    end

    def see_bad_guys(bad_guy = lex_luthor)
        #is this correct?
        Superpower.turn_into_toad(bad_guy)
    end
end

こんにちは、理解できないルビーコードを見ました。Superman クラス内からflap_wings を呼び出すにはどうすればよいですか? クラス内からインスタンスメソッドを呼び出すことはできますか? モジュールを含めることとモジュールを埋め込むことの違いは何ですか? なぜ、いつそれを行う必要がありますか?

4

2 に答える 2

2

モジュールを埋め込むと言うときは、例の「Fly」モジュールが「Superpower」に埋め込まれていることを意味していると思います。

その場合、ネストされたモジュールと呼びます。ネストされたモジュールを使用するのは、ネストされたモジュールが特にメイン モジュールを処理する場合のみです。たとえば、Fly のコードは Superpower に直接関連付けられていますが、利便性と読みやすさのために分離されています。

次のように、最初に superpower を含めてから次に fly するだけで、ネストされたモジュールのメソッドを使用できます。

Class Superman
    include Superpower
    include Fly
    # ...
end

詳細については、このブログで詳しく説明しています。

于 2009-01-19T23:29:11.723 に答える
1

Ruby には単一の継承しかないという事実を回避する方法であるミックスインに関するドキュメントを読みたいと考えています。特定のモジュール A をクラス B に含めることにより、A のすべてのモジュール メソッドは、実際にクラス B の一部であるかのように使用できます。

つまり、呼び出しturn_invisibleは次のように簡単です。

def run_away
  turn_invisible
end

別の名前空間にあるためflap_wings、次のように簡単です。

def fly_away
  Fly.flap_wings
end

しかし、私はあなたのコードを完成させて「実行」しようとはしていません。

ミックスインはあちこちで説明されてます。

于 2009-01-19T23:28:34.393 に答える