2017-07-07 6 views
1

なぜこのコードのために私はfolowingエラーがありますか?オブジェクトクラスのRuby拡張

module ForExtend 
    def print 
    print "ForExtend print method!" 
    end 
end 

class A 
end 

a = A.new 

class << a 
    extend ForExtend 
end 

a.print 

結果:クラス/ eigenclassが、この場合の方法printを産む

private method `print' called for #<A:0x005607b26811f8> 
(repl):16:in `<main>' 

何で?そして私はそれにどのようにアクセスできますか?

答えて

1

からKernel#printKernelがあるが故に、民間#print方法を持って、デフォルトでオブジェクト、Objectに含まれています。

aのためのモジュールを拡張する方法については
a.singleton_class.print 

@mudasobwa's answerをチェック:それはa上のシングルトンクラスのクラスメソッドだ - このメソッドは、このような場合にはどこにあるかについては



はまた、あなたがこれを解決しても、あなたは引数を取りませんし、それを再定義として、引数の数が間違って#printを呼び出すためのエラーが出るが、1でそれを呼び出すことに注意してください。メソッドを上書きするときに元の実装を呼び出すには、superを使用します。

1

Aクラスがあり、そのインスタンスはaではないためです。あなたはプライベートメソッドを呼び出すためのエラーを取得する理由については

module ForExtend 
    def print 
    puts "ForExtend print method!" 
    end 
end 

class A; end 

a = A.new 
a.extend ForExtend # ⇐ THIS WILL EXTEND a 

a.print 
#⇒ "ForExtend print method!" 
関連する問題