Groovy探索之運算子的過載 二

2021-08-22 17:25:55 字數 2284 閱讀 6079

groovy探索之運算子的過載 二

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即「.」運算子的過載。

還是以前一篇的yuan類來作為例子。

classyuan

}有了上面的類的定義,我們就可以如下使用這個類:

defy =newyuan()

y.num =

109printlny.tostring()

其中,「y.num =

109」就是乙個賦值語句,關鍵的運算子就是「.」;當然,我們還可以用該運算子進行取值運算,如下:

printlny.num

我們今天要說的就是對「.」運算子的過載。當然,只要我們稍微一想,就可以知道,該運算子應該和「set」和「get」方法有關。不錯,的確如此。

下面,我們來看看如何過載「.」運算子。

classyuan

deftostring()

}要過載取值運算,當然只要「get」方法就行了,注意看**中的「getowner()」方法,實現了它,我們就可以寫出「y.owner」這樣的**來。

下面來看我們的測試**:

defy =newyuan(num:

100)

y.owner

println

" has $ yuan."

執行結果為:

tom has 100 yuan.

當然,過載賦值運算就和「set」方法相關了,如下:

classyuan

deftostring()

}測試**如下:

defy =newyuan(num:

100)

y.owner =

'mike'

可以看到,「.」運算子的過載跟其他運算子的過載也都一樣,沒有什麼特別的地方。但為什麼要把它拿出來單獨成一篇呢?這是因為它跟dsl有很大關係,是groovy語言實現dsl的一種方式。

下面就來說一說如何使用「.」運算子來實現dsl的。

一直以來,我們都希望計算機能夠識別我們人類的自然語言,如它能夠幫我們計算這樣的題目:

12元+39毛+123分

當然,現在的計算機還不能做到這樣的場景。但是,現在有了dsl,我們能做到這樣的場景:

12.yuan+39.jiao+123.fen

這樣,就相當的接近我們的自然語言了。那麼,groovy語言是怎麼實現上面的場景的呢?

一看到「12.yuan」這樣的表示式,我們就可以想到,這不就是乙個取值運算嗎?我們可以過載「.」運算子。

不錯,groovy語言正是通過過載「.」運算子幫我們實現上面的場景的。既然要過載「.」運算子,那麼「12」又是乙個什麼物件呢?在groovy語言中一切都是物件,「12」是乙個integer物件。

對啦,我們只需要在integer類裡實現getyuan()方法,就可以過載取值運算子。但integer類是乙個已經存在的類,我們不能直接修改它。

那麼我們怎麼給integer類新增getyuan()方法呢?是的,通過metaclass,即元物件。

下面是實現上面的場景的**:

defmc =newexpandometaclass(integer.class,true)

mc.getyuan <<

mc.getjiao <<

mc.getfen <<

mc.initialize()

首先取得integer類的元物件:「defmc =newexpandometaclass(integer.class,true)」。

然後,再新增各個「get」方法,因為我們只需要實現取值運算,因此,只需要實現「get」方法就可以了。

最後例項化這個元物件,即「mc.initialize()」

現在,我們來測試這段**:

println

12.yuan+

45.jiao+

33.fen

結果為:

16.83

運算子的過載是groovy語言實現dsl的乙個很重要的方面,因此,我們拿出兩個章節才把它說完,希望我們在今後的編碼實踐中經常的使用到它。

Groovy探索之運算子的過載 一

groovy探索之運算子的過載 一 運算子最常用的是算術運算子和關係運算子。groovy語言對這些常用的運算子的過載提供了很好的支援。比如過載加號的方法是 plus 我們只要在我們自己的類中實現了該方法,就能使用加號對物件進行相加運算。下面舉個例子。比如,我們有乙個類yuan,用來模擬我們的人民幣元...

Groovy探索之運算子的過載 二

groovy探索之運算子的過載 二 前一篇詳細的說了說算術運算子和關係運算子的過載,這篇要說說賦值運算子和取值運算子,即 運算子的過載。還是以前一篇的 yuan 類來作為例子。classyuan 有了上面的類的定義,我們就可以如下使用這個類 defy newyuan y.num 109 printl...

運算子過載之過載型別運算子

普通型別 類型別 呼叫對應的只有乙個引數 引數的型別就是這個普通型別 的建構函式 需求 boy boy1 10000 薪資 建構函式boy int boy boy2 rock 姓名 建構函式boy char 普通型別賦值給類型別其實很簡單,就是專門的對這個賦值的型別定義乙個建構函式。編譯器在執行 的...