本帖最后由 喵呜喵5 于 2015-8-19 00:18 编辑
以下是个人想法,说实话刚接触脚本并且学Ruby的目的仅仅只是利用RM来做游戏的话,别看那个技术区那个帖子,会走火入魔的……基础都没打牢就去看这种元编程教程纯粹作死,坐等楼下Taroxd给出更好的解答:
1.其实我觉得你暂时没必要搞清楚这两个方法的区别……并且解释的话我觉得77楼说的挺详细的了……如果现在你还看不懂那些解释到底在说什么的话……你也用不上这两个方法
2.
一般在RGSS中,只要搞懂- class A
- def self.hello
- p "world"
- end
- end
复制代码- class << A
- def hello
- p "world"
- end
- end
复制代码 这两段代码作用相同- class A
- def self.hello
- p @hello
- end
- end
复制代码- class << A
- attr_reader :hello
- end
复制代码 这两段代码作用相同其实就够了,class << obj 进入obj的eigenclass,具体百度 Ruby eigenclass
3.返回实例方法,不玩元编程的话我想不到有什么卵用
4.
bind(obj)
将self绑定到obj上生成并返回一个bound method对象(即Method对象)。只能对下列两种对象进行绑定:调用过unbind方法的对象的类的实例;内部包含(定义某方法的)模块的类的实例。除此以外将引发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)
# 类的实例方法的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)
call 调用方法
m_foo_unbound.bind(obj).call # => :"Klass#foo"
注释后的内容表示输出结果为 Klass#foo…………= =
|