# 类的实例方法的UnboundMethod
class Foo
def foo
"foo"
end
end
# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>
# 生成Method对象,它以Foo的实例为receiver
p m.bind(Foo.new) # => #<Method: Foo(Foo)#foo>
# 生成Method对象,它以Foo的Bar子类
# 的实例为receiver(被禁止)
# ruby 1.8 特性: 取消了该限制
class Bar < Foo
end
# p m.bind(Bar.new) # => -18:in `bind': bind argument must be an instance of Foo (TypeError)
# 定义同名的特殊方法也不行
class << obj = Foo.new
def foo
end
end
p m.bind(obj) # => -:25:in `bind': method `foo' overridden (TypeError)
# 模块的实例方法的UnboundMethod
module Foo
def foo
"foo"
end
end
# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>
# 生成Method对象,它以内部包含Foo的Bar类
# 的实例为receiver
class Bar
include Foo
end
p m.bind(Bar.new) # => #<Method: Bar(Foo)#foo>
# Bar的子类也包含Foo,所以没问题
class Baz <Bar
end
p m.bind(Baz.new) # => #<Method: Baz(Foo)#foo>
# 定义同名的特殊方法也不行
class << obj = Baz.new
def foo
end
end
p m.bind(obj) # => -:27:in `bind': method `foo' overridden (TypeError)
# 类的实例方法的UnboundMethod
class Foo
def foo
"foo"
end
end
# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>
# 生成Method对象,它以Foo的实例为receiver
p m.bind(Foo.new) # => #<Method: Foo(Foo)#foo>
# 生成Method对象,它以Foo的Bar子类
# 的实例为receiver(被禁止)
# ruby 1.8 特性: 取消了该限制
class Bar < Foo
end
# p m.bind(Bar.new) # => -18:in `bind': bind argument must be an instance of Foo (TypeError)
# 定义同名的特殊方法也不行
class << obj = Foo.new
def foo
end
end
p m.bind(obj) # => -:25:in `bind': method `foo' overridden (TypeError)
# 模块的实例方法的UnboundMethod
module Foo
def foo
"foo"
end
end
# 生成UnboundMethod `m'
p m = Foo.instance_method(:foo) # => #<UnboundMethod: Foo(Foo)#foo>
# 生成Method对象,它以内部包含Foo的Bar类
# 的实例为receiver
class Bar
include Foo
end
p m.bind(Bar.new) # => #<Method: Bar(Foo)#foo>
# Bar的子类也包含Foo,所以没问题
class Baz <Bar
end
p m.bind(Baz.new) # => #<Method: Baz(Foo)#foo>
# 定义同名的特殊方法也不行
class << obj = Baz.new
def foo
end
end
p m.bind(obj) # => -:27:in `bind': method `foo' overridden (TypeError)