Ruby class_eval и yield - PullRequest
       2

Ruby class_eval и yield

0 голосов
/ 11 января 2010

Человек, я сегодня очищаю слои от лука, в любом случае вот код

class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.class_eval do
        define_method(m) do
          "<#{yield self if block_given?}>" 
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end

Моя проблема в том, что я пытаюсь получить доступ "здесь" в define_method (m), когда методвыполняется, а не когда создается.Текущий оператор "<# {yield self if block_given?}>" Не дает мне этого.И если вам интересно, я должен сохранить эту часть кода как есть, но я могу внести все изменения, которые я хочу, в MyClass.

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end

Может кто-нибудь помочь с синтаксисом?Заранее спасибо за помощь.

ОБНОВЛЕНИЕ: см. Мой ответ ниже.

Ответы [ 2 ]

1 голос
/ 11 января 2010

Попробуйте заменить

define_method(m) do
  "<#{yield self if block_given?}>" 
end

с:

define_method(m) do |&block|
  "<#{block.call if block}>" 
end

Это должно работать на 1.8.7 и выше. Вы также можете попробовать использовать module_eval:

self.class.module_eval %Q{
  def #{m}(&block)
    "<\#{block.call if block}>"
  end
}
0 голосов
/ 11 января 2010

Благодаря большому количеству откликов от Сергея и некоторым собственным попыткам, мне удается заставить его работать

class MyClass
  def initialize(dynamic_methods)
    @arr = Array.new(dynamic_methods)
    @arr.each { |m|
      self.class.module_eval %Q{
        def #{m}(&block)
          yield(self) if block_given?
        end
      end
    }
    end
end

tmp = MyClass.new ['method1', 'method2', 'method3']
tmp.method1 do |t|
  "here"
end

Как вы можете сказать, есть некоторые незначительные изменения в предложениях Сергея, поэтому спасибо за вашу помощь, Сергей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...