Ruby 1.9概要(3)类和模块

    xiaoxiao2024-05-17  121

    三、类和模块 1、Module#instance_methods, #private_instance_methods, #public_instance_methods Module这三个方法都将返回方法名 的symbol组成的数组,而非过去的字符串数组。 2、Module#const_defined?, #const_get 这两个方法都添加一个参数flag,用来决定是否将它的ancestor中的const包括在查 找链中,例如: module A; X  =   1 def  foo; end end module B   include A   const_defined?  " X "                                #  => true   const_defined?  " X " ,false                        # uninitialized constant   const_get  " X "                                     #  => 1   const_get  " X " ,false                              # uninitialized constant   end 3、Module#class_variable_defined?方法: class  X; end X.class_variable_defined? :@@a                     #  => false class  X; @@a  =   1  end X.class_variable_defined? :@@a                      #  => true class_variable_{get,set}方法: class  B; self end.class_variable_set(:@@a,  " foo " )         #  => "foo" 4、Module#attr等价于Module#attr_reader: class  Test   attr:foo    def  initialize     @foo = 3   end end t = Test.new puts t.foo    # =>3 t.foo = 4       # undefined method "foo=" 5、接下来是一个bug fix的问题。下面这段代码是为了证明对象的singleton类继承自对象的类: class  X;end; x = X.new;  class   <<  x;p self  <  X; end 在1.8上,这段代码打印nil,这是不符合Ruby的对象模型的,因此在1.9运行已经可以打印正确结果true了。 如果不理解这点,参照俺过去写的《Ruby对象模型》 6、新增Module#module_exec方法,与Object#instance_exec类似 7、绑定未绑定的方法时进行额外的子类型检查,例如下面的代码: class  Foo;  def  foo; end end module Bar    define_method(:foo, Foo.instance_method(:foo)) end a = "" a.extend Bar a.foo 在1.8上,这段代码只有当执行到 a.foo的时候才报错: "foo":bind arguments must be an instance of Foo(TypeError) 因为foo是Foo的instance method,因此调用者必须是Foo或者其子类的instance。 而在1.9中,在绑定还没有绑定的方法的时候引入了额 外的检查,因此上面这段代码不必等到a.foo调用就将报错: class  Foo;  def  foo; end end module Bar    define_method(:foo, Foo.instance_method(:foo))    # =》 in "defined_method":bind arguments  must be a subclass of Foo < TypeError > end 8、binding#eval方法,新增加的: a = 1 binding.eval( " p a " )   =>   1 这个貌似与1.8中的: a = 1 eval( " a " ,binding) 文章转自庄周梦蝶  ,原文发布时间2008-10-01 相关资源:敏捷开发V1.0.pptx
    最新回复(0)