濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > ruby聲明式語(yǔ)法的實(shí)現(xiàn)例子

ruby聲明式語(yǔ)法的實(shí)現(xiàn)例子

熱門標(biāo)簽:AI電銷機(jī)器人 線路 天津外呼系統(tǒng)怎么收費(fèi) 征服者企業(yè)地圖標(biāo)注 外呼線路從哪里出來(lái)的 淮安自動(dòng)外呼系統(tǒng)供應(yīng)商 中牟外呼系統(tǒng)違法嗎 巫師3地圖標(biāo)注魔力之所 漯河電銷 柯城手機(jī)地圖如何做地圖標(biāo)注

在ActiveRecord可以用很方便的聲明方式來(lái)定義model之間的關(guān)聯(lián)關(guān)系,例如:

復(fù)制代碼 代碼如下:

class Topic ActiveRecord::Base
  has_many :posts
  belongs_to :user
end

has_many和belongs_to其實(shí)是Topic類的class method,標(biāo)準(zhǔn)寫(xiě)法是:

復(fù)制代碼 代碼如下:

class Topic ActiveRecord::Base
  Topic.has_many(:posts)
  Topic.belongs_to(:user)
end

那么has_many可以給我們帶來(lái)什么呢?類方法has_many在被執(zhí)行的時(shí)候,給Topic的對(duì)象實(shí)例添加了一系列方法:posts, posts, orders.push......等等。所以當(dāng)我們?cè)趍odel里面聲明has_many,belongs_to等對(duì)象關(guān)系的時(shí)候,一系列相關(guān)的對(duì)象方法就被自動(dòng)添加進(jìn)來(lái)了。 讓我們來(lái)自己試試看吧:

復(fù)制代碼 代碼如下:

module M
  def self.included(c)
    c.extend(G)
  end
  module G
    def generate_method(*args)
      args.each do |method_name|
        define_method(method_name) { puts method_name }
      end
    end
end
end

class C
  include M
  generate_method :method1, :method2
end

c = C.new
c.method1
c.method2

我們定義了一個(gè)聲明generate_method,可以接受多個(gè)symbol,來(lái)動(dòng)態(tài)的創(chuàng)建同名的方法。現(xiàn)在我們?cè)陬怌里面使用這個(gè)聲明:generate_method :method1, :method2,當(dāng)然我們需要include模塊M。為什么ActiveRecord的model不需要include相關(guān)的模塊呢?當(dāng)然是因?yàn)門opic的父類ActiveRecord::Base已經(jīng)include了模塊Associations了。

類C通過(guò)include模塊M,調(diào)用了模塊M的一個(gè)included回調(diào)接口,讓類C去extend模塊G,換句話來(lái)說(shuō)就是,通過(guò)include模塊M,來(lái)給類C動(dòng)態(tài)添加一個(gè)類方法generate_method。

這個(gè)generate_method被定義在模塊G當(dāng)中,它接受一系列參數(shù),來(lái)動(dòng)態(tài)創(chuàng)建相關(guān)的方法。于是我們就實(shí)現(xiàn)了這樣的DSL功能:

通過(guò)在類C里面聲明generate_method :method1, :method2,讓類C動(dòng)態(tài)的添加了兩個(gè)實(shí)例方法method1,method2,是不是很有意思? 實(shí)際上rails的對(duì)象關(guān)聯(lián)聲明也是以同樣的方式實(shí)現(xiàn)的。

您可能感興趣的文章:
  • Ruby語(yǔ)法筆記
  • Ruby的基礎(chǔ)語(yǔ)法入門學(xué)習(xí)教程
  • Ruby編程中的語(yǔ)法使用風(fēng)格推薦
  • Ruby基礎(chǔ)語(yǔ)法初探
  • Ruby中一些基本語(yǔ)法知識(shí)點(diǎn)的羅列匯總
  • Ruby的基本語(yǔ)法學(xué)習(xí)總結(jié)
  • ruby 學(xué)習(xí)筆記(1) 初識(shí)語(yǔ)法
  • Ruby的語(yǔ)法和語(yǔ)言特性總結(jié)

標(biāo)簽:棗莊 內(nèi)江 克拉瑪依 南昌 河池 甘孜 大慶 西雙版納

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ruby聲明式語(yǔ)法的實(shí)現(xiàn)例子》,本文關(guān)鍵詞  ruby,聲明,式,語(yǔ)法,的,實(shí)現(xiàn),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ruby聲明式語(yǔ)法的實(shí)現(xiàn)例子》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于ruby聲明式語(yǔ)法的實(shí)現(xiàn)例子的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    古交市| 棋牌| 玉门市| 阜康市| 五寨县| 云浮市| 宁海县| 冀州市| 孟村| 竹溪县| 吉木萨尔县| 武川县| 电白县| 鱼台县| 孙吴县| 溧水县| 建水县| 高邑县| 新津县| 贡觉县| 阿尔山市| 郸城县| 吉木萨尔县| 平和县| 宁海县| 宜兴市| 宁国市| 汾阳市| 马关县| 舟曲县| 云南省| 南澳县| 陆丰市| 本溪市| 天峻县| 宜昌市| 金川县| 夏津县| 周口市| 南岸区| 平塘县|