掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
Ruby語言在實(shí)際使用中會創(chuàng)建許多類,來滿足我們的整體編程需求。對于初學(xué)者來說,我們必須熟練地掌握創(chuàng)建類的方法,比如Ruby創(chuàng)建可參數(shù)化類等等。#t#

創(chuàng)新互聯(lián)建站是專業(yè)的新會網(wǎng)站建設(shè)公司,新會接單;提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行新會網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
如果我們要創(chuàng)建很多類,這些類只有類成員的初始值不同,我們很容易想起:
這種Ruby創(chuàng)建可參數(shù)化類方式是錯誤的,實(shí)際上Ruby中的類成員不僅在這個類中被所有對象共享,實(shí)際上會被整個繼承體系共享,所以我們調(diào)用Terran.home_planet,會輸出“Mars”,而我們期望的是Earth一個可行的方法:
我們可以通過class_eval在運(yùn)行時延遲求值來達(dá)到目標(biāo):
- class IntelligentLife
- def IntelligentLife.home_planet
- class_eval("@@home_planet")
- end
- def IntelligentLife.home_planet=(x)
- class_eval("@@home_planet = #{x}")
- end
- #...
- end
- class Terran < IntelligentLife
- @@home_planet = "Earth"
- #...
- end
- class Martian < IntelligentLife
- @@home_planet = "Mars"
- #...
- end
- puts Terran.home_planet # Earth
- puts Martian.home_planet # Mars
最好的Ruby創(chuàng)建可參數(shù)化類方法:
我們不使用類變量,而是使用類實(shí)例變量:
- class IntelligentLife
- class << self
- attr_accessor :home_planet
- end
- #...
- end
- class Terran < IntelligentLife
- self.home_planet = "Earth"
- #...
- end
- class Martian < IntelligentLife
- self.home_planet = "Mars"
- #...
- end
- puts Terran.home_planet # Earth
- puts Martian.home_planet # Mars

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流