日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承

發布時間:2025/7/14 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 MyClassinclude MyModuledef sayHi puts(greet)end end

在類中用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行的代碼、因為這個方法是錯誤的!不能夠被調出去、





總結

以上是生活随笔為你收集整理的模块全解======ruby的类是单继承生物、所以出现了module、实现了多继承的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。