2016-05-11 6 views
0

Ниже образцов модулей (n номеров), которые я использую в своем проекте с тем же именем (-ами) метода с другим возвращаемым значением (префикс с именем модуля).ruby-define модули динамически

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: Я хотел бы использовать решение, предоставляемое Cary, так как это более идиоматических.

Теперь давайте ответим на вопрос, как указано в OP.

Проблема с heredoc

Object.class_eval <<TES 

должен быть закрыт с 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

Смежные вопросы