模組全解======>>ruby的類是單繼承生物、所以出現了module、實現了多繼承

來源:互聯網
上載者:User

ruby的類是單繼承生物、所以出現了module、實現了多繼承、

註:模組、常量和類的命名都是以大寫字母開頭

、 模組引用:
      1、如果引用的模組在同一個檔案中,則直接使用模組操作
      2、如果不在同一個檔案中,則需要使用require載入被引用模組所在檔案。(引用的是完整名稱)

可以使用module包含著各種class、再建立一個類使用include包含各種class、從而實現多重繼承、=。 =真是複雜的生物、想簡單點覺得變和更複雜了、

其實modeule不是能夠被執行個體化的、所以只能通過module.method這樣來引用方法、當然首先得來一句

instance_method :fun1 


Ruby提供了public、protected和private來修飾類成員,其含義與C++相同。但不同的是,在Ruby中,所有類變數都預設 是private的,而類函數都預設是public的。對類成員而言,也可像第4行那樣用attr_accessor對其進行修飾,使其可被外部存取。

類包括多個模組

 1 module Mod1  
2 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 Mod  
2 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定義下以下的方法

 1 module MyModule 
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.greet
2 return "I'm #{BADMOOD}. How are you?"
3 end

這裡定義的常量可以使用以下方法來訪問

MyModule::GOODMOOD

某天邇想引用一下greet方法時、可以使用

MyModule.greet

但是若果邇覺得煩瑣、可以先include該模組先

include MyModule 
puts( greet )

注意一下、使用include方法這僅僅只是引用greet方法、而非MyModule.greet、模組自己的方法只能由模組名稱引出、無法使用include方法替邇減少些打字的痛苦、

承接上面的例子、寫了一個類、引用上面的模組、沒錯啦!這就是RUBY多承繼承的實現方法 !

class MyClass  include MyModule  def sayHi puts    (greet)  endend

在類中用include包含了上面的模組、好吧、莪們執行個體化一下

1 ob = MyClass.new 
2 ob.sayHi
3 puts(ob.greet)

可以驚奇的發現、居然類的執行個體對象也可以訪問模組的執行個體方法、太神奇了、相當於已經繼承了模組的所有方法

下面再來個多重繼承的範例

 1 module MagicThing
2 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

從上面看、設定了多個模組、MagicThing和Treasure、還有一個Weapon的類、它們統統都在Sword的繼承中實現啦~ 首先Sword繼承了Weapon、然後再用include引入了兩個模組、所以下面的實現方法是完全成立的!

1 s = Sword.new
2 s.name = "Excalibur"
3 s.deadliness = "fatal"
4 s.value = 1000
5 s.owner = "Gribbit The Dragon"
6 s.power = "Glows when Orcs Appear"

下面莪們來關注一下模組裡頭的變數、注意一點、模組裡的本地變數是無法被模組外所調用的、甚至是return都不可以、這就是為什麼模組內部執行個體變數滿天飛的原因了

 1 x = 1 # local to this program
2
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)

可以看到莪已經屏蔽了第24行的代碼、因為這個方法是錯誤的!不能夠被調出去、

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.