如何使用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
答案 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
我只是把它打成一片,可能有很多东西可以改进(例如使用精炼)并简化。