Sunday, 23 October 2011

Note FOR Ruby 1.9 之Symbol, Module

Ruby之Symbol

  Symbol.all_symbols查看
  Ruby可以在运行是动态增加和删除一个方法,使用define_method,remove_method,使用method_defined?来确定是否定义了某方法

Ruby之Module

  Ruby中Module类似于Class,其superclass为Object,class为Class,只是Module不能实例化,不能继承,但是可以让一个类继承与一个module。Module主要有两个作用,一是作为命名空间;二是,Ruby中是单继承关系,Module用来解决多继承问题,Module对外是不可见。Ruby库中包含Math,Kernel模块
module MyModule
    A = "a"

    def method
    end

    def MyModule.moduleMethod
    end
end

MyModule::A
MyModule.moduleMethod

include MyModule
method
  include只是将module中的instance method导入,而模块函数则没有;类如果包含了模块,则类和类实例都可以访问模块实例方法
  模块的局部变量是对外不可见的,即使是外部调用模块实例方法,其方法引用局部变量也不可以:
x = 1

module Foo
     x = 50

     def no_bar
         return x
     end

     def bar
         @x = 1000
         return @x
     end

     puts "In Foo: x = #{x}"
end

include Foo
puts x
#puts no_bar
puts bar

  module可以有实例变量,模块函数可以访问:
module X
    @instvar = "@instvar"
    
    def self.aaa
        puts @instvar
    end
end

X.aaa

module X
    @instvar = "@instvar"
    @@classvar = "@classvar"
    def amethod
        @instvar = 10
        puts @instvar
    end
    
    def self.aaa
        puts @instvar
    end
end

include X
X.aaa
puts @instvar
amethod
puts @instvar
@instvar = "hello world"
puts @instvar
X.aaa
puts @@classvar
@@classvar = "bye"
puts @@classvar
可以使用X.instance_variables和self.instance_variables查看变量信息

  如果两个module有相同的实例方法,则取决于include的顺序,会引入后include的方法。为避免覆盖,使用alias newMethodName methodName
  require用于引用一个文件,其搜索路径为$:,或者使用load方法
require “mod.rb"和load("mod.rb", true)的区别:
  • load把代码以一个匿名模块导入
  • require只load文件一次
  Ruby已有的模块:
  • Comparable: 需要实现<=> 并且根据它实现< <= == >= > between?
  • Enumerable: 需要实现each
  • FileTest: 访问File类
  • GC: Ruby的垃圾回收,ObjectSpace模块
  • Kernel: 由Object类包含,build-in方法
  • Math
  • ObjectSpace: 垃圾回收相关,可以遍历当前对象
  • Precision
  • Process
  • Signal
  module_function用于指定一个方法同时为模块方法和模块实例方法
  extend对对象进行模块的扩展,而不影响其类,如果扩展的方法和类方法相同,则覆盖类方法:
module MyModule
    def amethod
    end
end

class MyClass
    def method
    end
end

ob = MyClass.new
ob.extend(MyModule)
ob.amethod

ob.freeze用于禁止extend,可以用frozen?来测试

No comments :

Post a Comment