模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承
ruby的類(lèi)是單繼承生物、所以出現(xiàn)了module、實(shí)現(xiàn)了多繼承、
注:模塊、常量和類(lèi)的命名都是以大寫(xiě)字母開(kāi)頭
、 模塊引用:
????? 1、如果引用的模塊在同一個(gè)文件中,則直接使用模塊操作
????? 2、如果不在同一個(gè)文件中,則需要使用require加載被引用模塊所在文件。(引用的是完整名稱)
可以使用module包含著各種class、再新建一個(gè)類(lèi)使用include包含各種class、從而實(shí)現(xiàn)多重繼承、=。 =真是復(fù)雜的生物、想簡(jiǎn)單點(diǎn)覺(jué)得變和更復(fù)雜了、
其實(shí)modeule不是能夠被實(shí)例化的、所以只能通過(guò)module.method這樣來(lái)引用方法、當(dāng)然首先得來(lái)一句
instance_method :fun1Ruby提供了public、protected和private來(lái)修飾類(lèi)成員,其含義與C++相同。但不同的是,在Ruby中,所有類(lèi)變量都默認(rèn) 是private的,而類(lèi)函數(shù)都默認(rèn)是public的。對(duì)類(lèi)成員而言,也可像第4行那樣用attr_accessor對(duì)其進(jìn)行修飾,使其可被外部訪問(wèn)。
類(lèi)包括多個(gè)模塊
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
模塊包含類(lèi)
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
這里定義的常量可以使用以下方法來(lái)訪問(wèn)
MyModule::GOODMOOD某天邇想引用一下greet方法時(shí)、可以使用
MyModule.greet但是若果邇覺(jué)得煩瑣、可以先include該模塊先
include MyModuleputs( greet )
注意一下、使用include方法這僅僅只是引用greet方法、而非MyModule.greet、模塊自己的方法只能由模塊名稱引出、無(wú)法使用include方法替邇減少些打字的痛苦、
承接上面的例子、寫(xiě)了一個(gè)類(lèi)、引用上面的模組、沒(méi)錯(cuò)啦!這就是RUBY多承繼承的實(shí)現(xiàn)方法 !
在類(lèi)中用include包含了上面的模組、好吧、莪們實(shí)例化一下
1 ob = MyClass.new2 ob.sayHi
3 puts(ob.greet)
可以驚奇的發(fā)現(xiàn)、居然類(lèi)的實(shí)例對(duì)象也可以訪問(wèn)模組的實(shí)例方法、太神奇了、相當(dāng)于已經(jīng)繼承了模組的所有方法
下面再來(lái)個(gè)多重繼承的范例
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è)置了多個(gè)模組、MagicThing和Treasure、還有一個(gè)Weapon的類(lèi)、它們統(tǒng)統(tǒng)都在Sword的繼承中實(shí)現(xiàn)啦~ 首先Sword繼承了Weapon、然后再用include引入了兩個(gè)模組、所以下面的實(shí)現(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"
下面莪們來(lái)關(guān)注一下模塊里頭的變量、注意一點(diǎn)、模塊里的本地變量是無(wú)法被模塊外所調(diào)用的、甚至是return都不可以、這就是為什么模組內(nèi)部實(shí)例變量滿天飛的原因了
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行的代碼、因?yàn)檫@個(gè)方法是錯(cuò)誤的!不能夠被調(diào)出去、
總結(jié)
以上是生活随笔為你收集整理的模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux连sql server
- 下一篇: Ajax框架及原理分析--视频