a1
はA
のメソッドです。インスタンスでクラスメソッドを呼び出すにはどうすればよいですか?
module A
def self.a1
puts "I am defined in A"
end
end
class Sample
include A
end
samp = Sample.new
samp.a1
に電話する方法を教えてください。
puts samp.a1
a1
はA
のメソッドです。インスタンスでクラスメソッドを呼び出すにはどうすればよいですか?
module A
def self.a1
puts "I am defined in A"
end
end
class Sample
include A
end
samp = Sample.new
samp.a1
に電話する方法を教えてください。
puts samp.a1
:
A.a1
のように、モジュールで呼び出すことができます意味self
接頭辞を持つモジュールのメソッドを宣言すると、それはinclude
と一緒にインポートされませんことを意味します。自己なしで宣言されたものは、「混合方法」、またはinclude
に自動的にインポートされるものです。include
メソッドを定義する複数のモジュールの場合、最後に含まれるモジュールは実際に呼び出されるモジュールになります。ここで修正がどちらかmodule A
にdef a1
にdef self.a1
を変更したり、代わりにA.a1
で直接呼び出すことです。 Bがa1
を定義している場合は、include B
が最初に優先されない限り、優先順位はになります。あなたはこの種のものは、事前に起こることを知っている場合は、(彼らは適切にインスタンスメソッドとして含まれるように、これはdef a1
からdef self.a1
からメソッド定義を変更するに注意してください)モジュールを含めているよう
、あなたはエイリアスを使用することができます。
を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
、しかし、私はこのような状況を避けるだろうし、あなたがすることができるしている場合は、モジュール内のいずれかの方法で名前を変更。しかし、時にはあなたは何かの理由や理由でできないことがあります。
それはA1ためだけなら、これは動作するはずです:
class Sample
include A
def a1
self.class.a1
end
end
あなたはすべてのメソッドのためにそれが必要な場合は、クラスのセンドコマンドでNoMethodErrorをキャッチしようとすることができ、それは通常、過剰です。
これは 'include'では動作しません - 代わりに' extend'する必要があります。 –
多くのチュートリアルでRubyのミックスインは非常に複雑になりました。なぜ私は本当にその理由を理解できません。 'include'はミックスインをスーパークラスにします。以上です。 Rubyのミックスインについては、文字通り何も理解できません。それはちょうど標準退屈な古い継承です。 –
@JörgWMittagこのような選択的な構成を可能にする言語を一度も使用したことがない人は、混乱することがあります。ほとんどの人は、単一または複数の継承に慣れており、通常は定義時にロックされます。 'include'を使うといつでも任意の"スーパークラス "型の継承を追加することができます。最初は非常に奇妙に思えますが、個々のオブジェクトについてもそうすることができます。 – tadman