2012-03-12 6 views
2

私はRubyをかなり新しくしていますが、do-blockコードの中に関数のdefコードが書かれているところです。これの目的は何です:ブロック内の関数defは何を成し遂げますか?

module Hi 
    def self.included(base) 
    base.class_eval do 
     def hello; puts 'Hello' end 
    end 
    end 
end 

私は私が最初に直進移動する前に、私のミックスインの概念を取得する必要があります確信している(と私は深くミックスインのとその他もろもろにダイビングの過程にいるよ)が、デフ方法:こんにちは、doブロック内で使用されている私を混乱させます

答えて

3

この特定のビットは、どのモジュールでもこの​​モジュールがincludeであるメソッド(hello)を定義しています。

class Foo 
    include Hi 
end 

# ...is equivalent to... 

class Foo 
    def hello 
    puts 'Hello' 
    end 
end 

あなたがModule#class_evalModule.included有益なのドキュメントを見つけることができます。これを考えると、次の2つのコードビットは(大体)と同等です。

+0

他の質問には、クラスの代わりに「Hi」が含まれていて、最後にクラスにこの新しいモジュールが含まれているとどうなりますか? – Raja

+0

私はirbで様々なことを試みましたが、Fooクラスのオブジェクトはhelloメソッドをまったく取得しません。 irbへのトリックはありますか? – Raja

+1

これは私のためにコードを貼り付けてから、私の最初のビットをirbに貼り付けます。 'f = Foo.new;を呼び出す。 f.hello'は "Hello"を出力します。あなたの1つ以上の質問については、 'self.included'がクラスに含まれていない他のモジュール上で実行される点を除いて、動作は同じです。 –

関連する問題