lazybios

《Ruby 元编程》读书笔记(五)

Ruby元编程

可调用对象

Method 对象

通过Kernel#method方法,可以获得一个用Method对象表示的方法,在之后可以用Method#call方法对其进行调用。同样也可以用Kernel#singleton_method方法把单件方法名转换为Method对象

示例代码
class MyClass
    def initialize(value)
        @x = value
    end
    def my_method
        @x
    end
end

obj = MyClass.new(1)
m = obj.method :my_method
m.call   #=> 1

自由方法

与普通方法类似,不同的是它会从最初定义它的类或模块中脱离出来(即脱离之前的作用域),通过Method#unbind方法,可以将一个方法变为自由方法。同时,你也可以通过调用Module#instance_method获得一个自由方法.

示例代码
module MyClass
    def my_method
        42
    end
end

unbound = MyModule.instance_method(:my_method)
unbound.class  #=> UnboundMethod

上面代码中的UnboundMethod对象,不能够直接用来调用,不过可以将一个UnboundMethod方法绑定到一个对象上,使其再次成为一个Method对象,然后再被调用执行。

上面的绑定过程可以通过UnboundMethod#bind方法把UnboundMethod对象绑定到一个对象上,从某个类中分离出来的UnboundMethod对象只能绑定在该类及其子类对象上,不过从模块中分离出来的UnboundMethod对象在Ruby2.0后就不在有此限制了。

此外还可以将UnboundMethod对象传递给Module#define_method方法,从而实现绑定。

String.send :define_method, :another_method, unbound
abc.anther_method  #=> 42

PS: 上面代码请与前一小节示例代码,结合起来看!

-待续-

微信关注「日拱一卒」公众号