2016-04-06 19 views
0

に定義されている場合、私は、次のコードを持っている - (rubymonksから)callメソッドと同じ名前のメソッドがクラス

ここ
module Foo 
    class ClassMethods 
    def guitar 
     "gently weeps" 
    end 
    end 
end 

class Bar 
    include Foo 
    def self.guitar 
    puts "hehe" 
    #call guitar function from ClassMethods 
    end 
end 

puts Bar.guitar 

、どのように私はクラスメソッドからギターの関数を呼び出します。 ClassMethodsはスーパークラスではないため、スーパーキーワードは使用できません。

+1

名前にもかかわらず、RubyMonkの演習では、明快さよりも混乱が生じるようです。 – Stefan

+0

whyyyyyyyyy誰も私に語ったことは分かりません。 –

+1

'ClassMethods.new.guitar'でその行を置き換えてください。 1行に "hehe"と表示され、次の行で "穏やかに泣き"ます。 –

答えて

1

構造のそのようなものは、通常の両方に使用され、includeに1回の呼び出しでにモジュールを拡張含みます。それはextendコールを呼び出すincludedコールバックを設定することで動作します:

module Foo 
    def self.included(mod) 
    mod.extend(ClassMethods) 
    end 

    module ClassMethods 
    def guitar 
     "gently weeps" 
    end 
    end 
end 

class Bar 
    include Foo 

    def self.guitar 
    puts "hehe" 
    super 
    end 
end 

puts Bar.guitar 
#=> hehe 
#=> gently weeps 

上記と同等です:

もちろん
module Foo 
    module ClassMethods 
    def guitar 
     "gently weeps" 
    end 
    end 
end 

class Bar 
    include Foo 
    extend Foo::ClassMethods 

    def self.guitar 
    puts "hehe" 
    super 
    end 
end 

インスタンスメソッド(または定数がある場合は、include Fooにのみ/理にかなっていますモジュール変数)。あなたの例では、extendが必要です。

関連する問題