2017-11-28 13 views

答えて

2

  • あなたは、彼らが直接A.a1のように、モジュールで呼び出すことができます意味self接頭辞を持つモジュールのメソッドを宣言すると、それはincludeと一緒にインポートされませんことを意味します。自己なしで宣言されたものは、「混合方法」、またはincludeに自動的にインポートされるものです。
  • includeメソッドを定義する複数のモジュールの場合、最後に含まれるモジュールは実際に呼び出されるモジュールになります。

ここで修正がどちらかmodule Adef a1def self.a1を変更したり、代わりにA.a1で直接呼び出すことです。 Bがa1を定義している場合は、include Bが最初に優先されない限り、優先順位はになります。あなたはこの種のものは、事前に起こることを知っている場合は、(彼らは適切にインスタンスメソッドとして含まれるように、これはdef a1からdef self.a1からメソッド定義を変更するに注意してください)モジュールを含めているよう

+0

多くのチュートリアルでRubyのミックスインは非常に複雑になりました。なぜ私は本当にその理由を理解できません。 'include'はミックスインをスーパークラスにします。以上です。 Rubyのミックスインについては、文字通り何も理解できません。それはちょうど標準退屈な古い継承です。 –

+0

@JörgWMittagこのような選択的な構成を可能にする言語を一度も使用したことがない人は、混乱することがあります。ほとんどの人は、単一または複数の継承に慣れており、通常は定義時にロックされます。 'include'を使うといつでも任意の"スーパークラス "型の継承を追加することができます。最初は非常に奇妙に思えますが、個々のオブジェクトについてもそうすることができます。 – tadman

0

、あなたはエイリアスを使用することができます。

module A 
    def a1 
    puts "I am defined in A" 
    end 
end 

module B 
    def a1 
    puts "I am defined in B" 
    end 
end 

class Sample 
    include A 
    alias :a_a1 :a1 
    include B 
    alias :b_a1 :a1 
end 

samp = Sample.new 
samp.a_a1 
samp.b_a1 
samp.a1 

実行されている。この出力:一般的なルールとして

I am defined in A 
I am defined in B 
I am defined in B 

、しかし、私はこのような状況を避けるだろうし、あなたがすることができるしている場合は、モジュール内のいずれかの方法で名前を変更。しかし、時にはあなたは何かの理由や理由でできないことがあります。

0

それはA1ためだけなら、これは動作するはずです:

class Sample 
    include A 
    def a1 
    self.class.a1 
    end 
end 

あなたはすべてのメソッドのためにそれが必要な場合は、クラスのセンドコマンドでNoMethodErrorをキャッチしようとすることができ、それは通常、過剰です。

+1

これは 'include'では動作しません - 代わりに' extend'する必要があります。 –

関連する問題