ruby 中的 module

  • Module是Class的父类:
    >> Class.superclass
    => Module

  • module 没有实例变量

  • module 没有new不能生成实例对象

module内可以有常量

>> module Test
>>   PI=3.14
>> end
=> 3.14
>> Test.PI
>> Test::PI
=> 3.14

module的方法有两种,一种是module方法,这类方法可以直接调用。

>> module Test
>>   def Test.test_method
>>     puts "hello from module"
>>   end
>> end
=> nil
>> Test::test_method
hello from module
=> nil

另一种是没有module名字的方法,这种方法不能直接调用,需要mixin到一个类中。

>> module Test
>> def hello
>>   puts "hello"
>> end
>> end
=> nil
>> Test::hello
NoMethodError: undefined method `hello' for Test:Module
    from (irb):23

把module的方法添加到类中有两种方法。

一种是include,方法会被添加到实例方法中。

一种是extend,方法会被添加到类方法中。

继续前面的module Test的例子

>> class Class1
>> include Test
>> end
=> Class1
>> Class1.new.hello
hello
=> nil
>> class Class2
>> extend Test
>> end
=> Class2
>> Class2.hello
hello
=> nil

module常用的一个hook/callback是included方法,这个方法在module被include到一个类中的时候会被调用。

>> module Test
>>   def self.included(cls)
>>     puts "including module in class #{cls.name}"
>>    end
>> end
=> nil
>> class Class1 
>>   include Test
>> end
including module in class Class1
=> Class1

 

原文地址:https://www.cnblogs.com/wangyuyu/p/3549866.html