2016-08-28 7 views
1
Ruby言語で

、私は動的に格納されている文字列(例えば:"ModuleName::Submodule:methodName")としてメソッド名を持つ、モジュールに属しているメソッドを呼び出す必要がありダイナミックディスパッチ(メソッドがモジュールの一部である場合)のメソッドをRubyで呼び出す方法は?

のは、このような場合を考えてみましょう:

module Dialogs  
    def paperino(param) 
    puts "paperino. param: #{param}" 
    end 
end 

どのようにすることができます実行時に.call( "parametro")を実行しますか?

私はより良い説明:メソッドの場合

は私が行う方法を知っているクラスの一部です: 私は(文字列から、私はメソッドオブジェクトを呼び出す)クラスをインスタンス化:

class Dialogo 
    def pluto(param) 
    puts "pluto. param: #{param}" 
    end 
end 

class_name = "Dialogo" 
# create class symbol from a string 
class_symbol = Kernel.const_get(class_name) 

# return a new instance 
class_instance = class_symbol.new 

# Instantiating a method object 
method_object = class_instance.method(:pluto) 

# call the method in run time: 
method_object.call "parametro_pluto" 

と明示的なクラスのない方法の簡素状況

def pippo(param) 
    puts "pippo. param: #{param}" 
end 

method_object = Kernel.method(:pippo) 
method_object.call "parametro" 

しかし、動的モジュールの一部であるメソッドを呼び出すための構文は何ですか?

次の例では:

module Dialogs  
    def paperino(param) 
    puts "paperino. param: #{param}" 
    end 
end 

私が呼び出したいメソッドは、 "ダイアログ:: paperino"

ところで、私はどちらも使用しない(送信しない)やeval(あります) 、しかしちょうどコール()。

おかげ ジョルジオ

+1

このような方法は呼び出されることを意味しません。モジュールをどこかに入れるか、http://apidock.com/ruby/Module/module_function –

答えて

1

私はあなたができるとは思いません。このようにしてモジュール上に定義されたメソッドは、直接アクセスすることを目的としていません。

Dialogs.paperino('a') 
NoMethodError: undefined method `paperino' for Dialogs:Module 

あなたはself

def self.paperino(param) 

を使用してDialogsでそれを定義することができますそして、あなたはここにあるdef paperino(param)としてそれを定義する必要があるなら、あなたはmethod

Dialogs.method(:paperino) 

でそれをアクセスすることができますメソッドにアクセスできる方法。

method = (Object.new.extend(Dialogs)).method(:paperino) 
method.call('foo') 

これは、新しいオブジェクトを定義した後、モジュールDialogsでそのオブジェクトを拡張します。次に、メソッドを取得できます。

+0

Thxを見てください!あなたの答えは明らかです。私はしばしばRubyのモジュールで問題を抱えています(可変スコープでも,-))。 –

関連する問題