@Stivie

Как можно использовать точки в именах функций Ruby?

Есть класс с обработкой method_missing(). Я хочу передать этому классу название функции типа: func.name(agrs). И потом обработать эту функцию в моем классе.
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
@vsuhachev
Да такое возможно сделать, вот набросал код вроде работает :)))

class A

  class CallProxy
    def initialize(obj, name)
      @call_chain = [name]
      @obj = obj
    end

    def method_missing(name, *args)
      @call_chain << name

      case
        when good_chain?([:func, :name])
          same_chain?([:func, :name]) ? @obj.func_name(*args) : self
        else
          fail "Invalid func: #{@call_chain.join('.')}"
      end
    end

    def good_chain?(chain)
      chain[0..@call_chain.length] == @call_chain
    end

    def same_chain?(chain)
      chain == @call_chain
    end

  end

  def method_missing(name, *args)
    CallProxy.new(self, name)
  end

  def func_name(param)
    param * 3
  end

end

obj = A.new
puts obj.func.name('Blah')
puts obj.func.oops('Blah')
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы