#定义模块,虽然模块看起来很象一个类,但是它永远不能有一个实例?
#怎么听起来象纯虚类?
module Black
#属性
Name='blackant'
#方法
def Black.Hello(str)
'hello '+str
end
end
module SumModule
def sum
inject{|result,n| result+=n}
end
end
module InstaneModule
State={}
def State=(value)
State[object_id]=value
end
def State
State[object_id]
end
end
module NotInstanceModule
def State=(value)
@State=value
end
def State
@State
end
end
#使用模块
#外部引用 load每次调用都会引入文件,但require只会调用一次
#连续两次load会给一个警告,但连续两次require不会
#load 'module.rb'
require 'module.rb'
#require文件名, .rb也可以省略#还是叫它module吧
#纯虚类是不能这样使用的
puts Black.Hello(Black::Name)
#include符合合成/聚合复用原则
class IncludeBlack
include Black
end
puts Black.Hello(Black::Name)
#自定义可枚举类
class SupportEnumerable
def initialize(str)
@str=str
end
#包含Enumerable模块
include Enumerable
#实现each
def each
@str.scan(/[aeiou]/) do |chr|
yield chr
end
end
end
#扩充SupportEnumerable,再它再支持求和
class SupportEnumerable
include SumModule
end
se=SupportEnumerable.new("I Love Ruby")
puts se.inject{|result,i| result+=i} #oeu
puts se.sum#oeu
#如果模块中含有变量,可能造成多个实例共用一个实例.解决方法是为每个实体单独命名它们的变量
class SupportInstaneModule
include InstaneModule
end
sim1=SupportInstaneModule.new
sim1.State=true
sim2=SupportInstaneModule.new
sim2.State=false
puts sim1.State,sim2.State #true,false
#可是书上虽然这样说,我试了一下,好象也是每个类单独使用了自己的变量实例
#我的版本是185.21的
class SupportNotInstanceModule
include NotInstanceModule
end
snim1=SupportNotInstanceModule.new
snim2=SupportNotInstanceModule.new
snim1.State=true
snim2.State=false
puts snim1.State,snim2.State #true,false
#怎么听起来象纯虚类?
module Black
#属性
Name='blackant'
#方法
def Black.Hello(str)
'hello '+str
end
end
module SumModule
def sum
inject{|result,n| result+=n}
end
end
module InstaneModule
State={}
def State=(value)
State[object_id]=value
end
def State
State[object_id]
end
end
module NotInstanceModule
def State=(value)
@State=value
end
def State
@State
end
end
#使用模块
#外部引用 load每次调用都会引入文件,但require只会调用一次
#连续两次load会给一个警告,但连续两次require不会
#load 'module.rb'
require 'module.rb'
#require文件名, .rb也可以省略#还是叫它module吧
#纯虚类是不能这样使用的
puts Black.Hello(Black::Name)
#include符合合成/聚合复用原则
class IncludeBlack
include Black
end
puts Black.Hello(Black::Name)
#自定义可枚举类
class SupportEnumerable
def initialize(str)
@str=str
end
#包含Enumerable模块
include Enumerable
#实现each
def each
@str.scan(/[aeiou]/) do |chr|
yield chr
end
end
end
#扩充SupportEnumerable,再它再支持求和
class SupportEnumerable
include SumModule
end
se=SupportEnumerable.new("I Love Ruby")
puts se.inject{|result,i| result+=i} #oeu
puts se.sum#oeu
#如果模块中含有变量,可能造成多个实例共用一个实例.解决方法是为每个实体单独命名它们的变量
class SupportInstaneModule
include InstaneModule
end
sim1=SupportInstaneModule.new
sim1.State=true
sim2=SupportInstaneModule.new
sim2.State=false
puts sim1.State,sim2.State #true,false
#可是书上虽然这样说,我试了一下,好象也是每个类单独使用了自己的变量实例
#我的版本是185.21的
class SupportNotInstanceModule
include NotInstanceModule
end
snim1=SupportNotInstanceModule.new
snim2=SupportNotInstanceModule.new
snim1.State=true
snim2.State=false
puts snim1.State,snim2.State #true,false