2013-02-26 18 views
30

Rubyモジュール(ミックスイン)を使用しようとしています。Ruby:module、require and include

#!/usr/bin/env ruby 
require_relative 'lib/mymodule' 

class MyApp 
    include MyModule 
    self.hallo 
end 

とlib/mymodule.rb:

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

非常に簡単セットアップ

は私がtest.rbを持っています。しかし、それは:(動作しません:?。

ruby test.rb 
test.rb:8:in `<class:MyApp>': undefined method `hallo' for MyApp:Class (NoMethodError) 
     from test.rb:6:in `<main>' 

はどこエラーです

答えて

53

要約:モジュールincludeの代わりにextendが必要です。

class MyApp 
    extend MyModule 
    self.hallo 
end 

includeでそれを混合するクラスのインスタンスメソッドを提供する。

extend

でそれを混合クラスのクラスの方法を提供する。

thisにリードを与えます。

3

あなたのコードが動作している - しかし、モジュールは、あなたがそれがないと思う何をしないなどのモジュールを含むクラスが取得することはありません方法 - このクラスの意志からオブジェクト

だからこれが機能する:。

class MyApp 
    include MyModule 
end 

my_app_object = MyApp.new 
my_app_object.hallo # => hallo 

my_app_objectは、モジュールMyModuleというのミックスインを持つクラスのMyAppの目的であるT。モジュールとミックスインの詳細な説明はthereをご覧ください。

8

問題は、インスタンスメソッド(include)として追加している間に、クラス定義でhalloを呼び出していることです。

だから、あなたは(halloは、クラスメソッドになる)extendを使用することができ、次のいずれか

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

class MyApp 
    extend MyModule 
    self.hallo 
end 

かのMyAppのインスタンスのいずれかでコールhallo

module MyModule 
    def hallo 
    puts "hallo" 
    end 
end 

class MyApp 
    include MyModule 
end 

an_instance = MyApp.new 
an_instance.hallo 
1
class MyApp 
    class << self 
    include MyModule 
    end 
    self.hallo 
end 

と同じですが

class MyApp 
    extend MyModule 
    self.hallo 
end 

extendsは、クラスオブジェクトを開き、モジュールメソッドを含めるだけです。 "hallo"はクラスオブジェクトの別名になります。 MyAppクラスの静的メソッド。

受信者のインスタンスにメソッドを「インクルード」します。オブジェクト自体には「自己」ではありません。あなたのケースが「自己」である場合、レシーバーにメソッドを「拡張」します。

self.include MyModule // inject the methods into the instances of self 
self.extend MyModule // inject the methods into object self 

"self"は、クラスオブジェクトMyAppを指します。

また、 "include"と "extend"はmodule.rbで定義されたメソッドに過ぎないことに注意してください。 "include"はクラスオブジェクトメソッド(static-method)で、 "extend"はインスタンスメソッドです。

関連する問題