2016-05-11 8 views
0

私のプロジェクトで同じ戻り値(モジュール名の接頭辞)を持つ同じメソッド名を使用しているサンプルモジュール(n個の数値)以下ruby​​-動的にモジュールを定義する

module Example1 
def self.ex_method 
    'example1_with_' 
end 
end 


module Example2 
def self.ex_method 
    'example2_with_' 
end 
end 

私は#define_methodのようなメタプログラミングの方法でこれを達成しようとしました。しかし、それは私のために働いていない。それを行う方法はありますか?

array.each do |name| 
    Object.class_eval <<TES 
    module #{name} 
     def self.ex_method 
     "#{name.downcase}_with_" 
     end 
    end 
    TES 
end 

エラースナップ:あなたが最後の行で見ることができたが、それが完了していないことを言います。

enter image description here

+0

"動作しない" 良い定義ではありません。何が問題ですか?どのようなエラーメッセージが表示されますか? –

+0

エラーはありません。私が 'irb'で試してみると、コマンドは終了してもメソッドは閉じられません。 「なぜ良い定義ではないのですか? –

+1

なぜそれは良い定義ではありませんか? stacktraceなどのようなエラーメッセージについては何も述べていないからです。 できるだけ多くの(関連する)詳細を提供し、問題を容易に理解できるようにします。 おそらく、あなたはそのようなものを実装したいのですか? –

答えて

6
m = Object.const_set("Example1", Module.new) 
    #=> Example1 
m.define_singleton_method("ex_method") { 'example1_with' } 
    #=> :ex_method 

を見てみましょう:

Example1.is_a? Module 
    #=> true 
Example1.methods.include?(:ex_method) 
    #=> true 
Example1.ex_method 
    #=> "example1_with" 
4

NB:それはより多くの慣用的なので、私は、キャリーが提供するソリューションを使用します。

ここでOPに記載されているように質問に答えましょう。

問題がheredoc

Object.class_eval <<TES 

である第1の位置にTESで閉鎖されます。あなたがそうであるように、閉じるには使用:

#     ⇓ HERE 
Object.class_eval <<-TES 
+0

ありがとうございました。それは働いている。 '-'の使い方を教えていただけますか? –

+0

@ Mr.Black:これは、終了識別子のインデントを許可します。 http://ruby-doc.org/core-2.2.0/doc/syntax/literals_rdoc.html –

+0

http://rubyquicktips.com/post/4438542511/heredoc-and-indent – mudasobwa

関連する問題