`
liss
  • 浏览: 826377 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ruby学习笔记(10)--模块

    博客分类:
  • Ruby
阅读更多

#定义模块,虽然模块看起来很象一个类,但是它永远不能有一个实例?
#怎么听起来象纯虚类?
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

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackant2/archive/2006/12/04/1429135.aspx

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics