论坛首页 编程语言技术论坛

ruby动态编程

浏览 15337 次
该帖已经被评为良好帖
作者 正文
   发表时间: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>
0 请登录后投票
   发表时间: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>

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics