如何使用Ruby在模块/类中定义原始名称范围

时间:2016-12-17 06:15:49

标签: ruby

如何使用Ruby

在模块/类中定义原始名称范围

我想实现如下的类:

module SomeModule
  extend OriginalNameScope

  scope(:some) do
    def method1
      puts 1
    end

    def method2
      puts 2
    end
  end
end

class SomeClass
  include SomeModule
end

c = SomeClass.new

# I want to call methods like the following:
c.some_method1
c.some_method2

如何实现OriginalNameScope模块?我发现在这个方法中得到了方法定义,但我不知道如何用前缀范围重新定义方法。

module OriginalNameScope
  def scope(name, &method_definition)
    puts method_definition.class
    # => Proc
  end
end

1 个答案:

答案 0 :(得分:0)

这实际上只是一些简单的标准Ruby元编程模式和习语的组合:

module OriginalNameScope
  def scope(name)
    singleton_class.prepend(Module.new do
      define_method(:method_added) do |meth|
        if name && !@__recursion_guard__
          @__recursion_guard__ = meth
          method = instance_method(meth)
          undef_method(meth)
          define_method(:"#{name}_#{meth}") do |*args, &block|
            method.bind(self).(*args, &block)
          end
        end
        @__recursion_guard__ = nil
        super(meth)
      end            
    end)
    yield
  end
end

我只是把它打成一片,可能有很多东西可以改进(例如使用精炼)并简化。