模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承
ruby的類是單繼承生物、所以出現(xiàn)了module、實現(xiàn)了多繼承、
注:模塊、常量和類的命名都是以大寫字母開頭
、 模塊引用:
????? 1、如果引用的模塊在同一個文件中,則直接使用模塊操作
????? 2、如果不在同一個文件中,則需要使用require加載被引用模塊所在文件。(引用的是完整名稱)
可以使用module包含著各種class、再新建一個類使用include包含各種class、從而實現(xiàn)多重繼承、=。 =真是復(fù)雜的生物、想簡單點覺得變和更復(fù)雜了、
其實modeule不是能夠被實例化的、所以只能通過module.method這樣來引用方法、當(dāng)然首先得來一句
instance_method :fun1Ruby提供了public、protected和private來修飾類成員,其含義與C++相同。但不同的是,在Ruby中,所有類變量都默認 是private的,而類函數(shù)都默認是public的。對類成員而言,也可像第4行那樣用attr_accessor對其進行修飾,使其可被外部訪問。
類包括多個模塊
1 module Mod12 def fun1
3 puts "Mod1::fun1"
4 end
5 instance_method :fun1
6 end
7 module Mod2
8 def fun2
9 puts "Mod2::fun2"
10 end
11 instance_method :fun2
12 end
13 class Cls
14 include Mod1
15 include Mod2
16 end
17 obj = Cls.new
18 obj.fun1
19 obj.fun2
模塊包含類
1 module Mod2 def myFunction
3 puts "myFunction"
4 end
5 module_function :myFunction
6 class Class
7 def yourFunction
8 puts "Mod::Class.yourFunction"
9 end
10 end
11 end
12 Mod.myFunction
13 object = Mod::Class.new
14 object.yourFunction
假如module定義下以下的方法
2 GOODMOOD = "happy"
3 BADMOOD = "grumpy"
4 def greet
5 return "I'm #{GOODMOOD}. How are you?"
6 end
7 def MyModule.greet
8 return "I'm #{BADMOOD}. How are you?"
9 end
10 end
其中的MyModule.greet方法、等同于
1 def self.greet2 return "I'm #{BADMOOD}. How are you?"
3 end
這里定義的常量可以使用以下方法來訪問
MyModule::GOODMOOD某天邇想引用一下greet方法時、可以使用
MyModule.greet但是若果邇覺得煩瑣、可以先include該模塊先
include MyModuleputs( greet )
注意一下、使用include方法這僅僅只是引用greet方法、而非MyModule.greet、模塊自己的方法只能由模塊名稱引出、無法使用include方法替邇減少些打字的痛苦、
承接上面的例子、寫了一個類、引用上面的模組、沒錯啦!這就是RUBY多承繼承的實現(xiàn)方法 !
在類中用include包含了上面的模組、好吧、莪們實例化一下
1 ob = MyClass.new2 ob.sayHi
3 puts(ob.greet)
可以驚奇的發(fā)現(xiàn)、居然類的實例對象也可以訪問模組的實例方法、太神奇了、相當(dāng)于已經(jīng)繼承了模組的所有方法
下面再來個多重繼承的范例
1 module MagicThing2 attr_accessor :power
3 end
4
5 module Treasure
6 attr_accessor :value
7 attr_accessor :owner
8 end
9
10 class Weapon
11 attr_accessor :deadliness
12 end
13
14 class Sword < Weapon
15 include Treasure
16 include MagicThing
17 attr_accessor :name
18 end
從上面看、設(shè)置了多個模組、MagicThing和Treasure、還有一個Weapon的類、它們統(tǒng)統(tǒng)都在Sword的繼承中實現(xiàn)啦~ 首先Sword繼承了Weapon、然后再用include引入了兩個模組、所以下面的實現(xiàn)方法是完全成立的!
1 s = Sword.new2 s.name = "Excalibur"
3 s.deadliness = "fatal"
4 s.value = 1000
5 s.owner = "Gribbit The Dragon"
6 s.power = "Glows when Orcs Appear"
下面莪們來關(guān)注一下模塊里頭的變量、注意一點、模塊里的本地變量是無法被模塊外所調(diào)用的、甚至是return都不可以、這就是為什么模組內(nèi)部實例變量滿天飛的原因了
1 x = 1 # local to this program2
3 module Foo
4 x = 50 # local to module Foo
5
6 # This can be mixed in but the variable x won't then be visible
7 def no_bar
8 return x
9 end
10
11
12 def bar
13 @x = 1000
14 return @x
15 end
16
17 puts("In Foo: x = #{x}") # this can access the ?module local? x
18 end
19
20
21 include Foo
22
23 puts(x)
24 #puts(no_bar) # Error! This can't access the module-local variable
25 ## needed by the no_bar method
26 puts(bar)
可以看到莪已經(jīng)屏蔽了第24行的代碼、因為這個方法是錯誤的!不能夠被調(diào)出去、
總結(jié)
以上是生活随笔為你收集整理的模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux连sql server
- 下一篇: Ajax框架及原理分析--视频