锁定老帖子 主题:ruby动态编程
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-10-02
最后修改:2009-10-02
在类内用define_methods定义一个实例方法,传入闭包内有self,该self为什么不是表示定义它的类上下文?
Person = Class.new p1 = Person.new puts p1.class #Person class Person define_method :who? do puts self end end p1.who? #<Person:0xb8bcdb4> |
|
返回顶楼 | |
发表时间:2009-10-02
define_method(name) { ... }
定义名为name的实例方法。method可以是Proc、Method或UnboundMethod这三者之一的实例。当指定了method参数时,就返回该参数。若带块调用时,会将块变成Proc化对象,然后返回该对象。 例: class Foo def foo() p :foo end define_method(:bar, instance_method(:foo)) end Foo.new.bar # => :foo 带块调用时,各版本的处理方式不尽相同。在Ruby 1.7以后的版本中,在执行新定义的方法时,将会在receiver类的实例的基础上对块执行instance_eval。而在Ruby 1.6版本中,只是在块与方法之间取得关联,在执行新定义的方法时,块只是运行在生成时的context中。请参考下例。 class C end # 定义实例方法 print_self 。 # 但因为 define_method 是私有方法 # 所以不能直接调用。必须借助于 __send__ 来进行调用。 C.__send__(:define_method, :print_self) { p self } # 在 1.6 版本中 C.new.print_self #=> main # 在 1.7 版本中 C.new.print_self #=> #<C:0x4015b490> |
|
返回顶楼 | |