Scala 的那些奇怪的符號 (一)

2021-07-15 19:57:32 字數 2670 閱讀 9588

scala的語法很多,有些人認為過於繁瑣,有些人卻認為正是因為繁瑣,所以才讓這門語言嚴謹和強大。

例如在翻閱scala資料或者檢視scala原始碼的時候,經常會看到「<:>:」,這是什麼鬼?下面我就來**一下這兩個符號的用法:

我們定義乙個類:「earth」

class earth 

}

我們定義了乙個子類:「animal」

class animal extends earth }
然後 ,還有animal 的乙個子類 「bird」

class bird extends animal }
最後,又定義了乙個函式:

def biophony[t <: animal seq things map>
乍一看:這tm是什麼鬼?「<:>

其實, 這屬於scala泛型中的知識:上邊界和下邊界。上邊界是「<:>:」;t <: animal>

知道了是什麼之後,接著呼叫就很簡單了:

biophony(seq(new bird, new bird))
這樣一來就輸出:

bird sounds

bird sounds

完美!假如因為可以包含animal所以,這麼呼叫也可以:

biophony(seq(new animal, new animal))
輸出:

animal sound

animal sound

甚至可以乙個animal,乙個bird,多型嘛!

biophony(seq(new animal, new bird))
輸出:

animal sound

bird sounds

但是,這樣就不可以了:

biophony(seq(new earth, new earth))
輸出:

報錯!scala的定義了乙個「界限」來規定泛型可以適用的在繼承關係中的範圍,「<:>

我們把「<:>:」

def biophony[t >: animal](things: seq[t]) = things map (_.sound())
不對這怎麼還報紅了呢?細細想來,animal的父類的話,不能確定能不能有sound()方法呀,因為父類太多了,object還是呢。報錯也正常,我們就直接返回 things吧

def biophony[t >: animal](things: seq[t]) = things
好了,這下好了,不報紅了,我們傳乙個animal的父類「earth」的佇列,然後沒個元素呼叫「sound()」方法

biophony(seq(new earth, new earth)).map(_.sound())
輸出:

hello !

hello !

之前的結論,呼叫animal也應該是可以的:

biophony(seq(new animal, new animal)).map(_.sound())
輸出:

animal sound

animal sound

好的,也是正確的。假如我們傳animal子類bird看看會不會報錯

biophony(seq(new bird, new bird)).map(_.sound())
輸出:

bird sounds

bird sounds

居然不報錯!還執行了!這是怎麼回事??

我們看一下傳bird後的返回值是什麼:

是animal !真相大白了,由於bird是子類,scala把bird當做animal來處理了。也就是說,「>:」的時候,傳任何引數都可以,但是返回值回有所不同,animal的子類都會統一按照animal來處理!

那我們傳乙個和animal毫不相關的類,會出現什麼情況呢?

class moon
寫了乙個moon,然後按照如下文傳參呼叫

biophony(seq(new moon, new moon))
不報錯!

我們看一下返回值:

object!scala把它看做了object。也就是說,可以隨便傳!只不過和animal直系的,是animal父類的還是父類處理,是animal子類的按照animal處理,和animal無關的,一律按照object處理!

scala 符號的使用

一 匿名函式,左邊是引數 右邊是函式實現體 val list list 1,2,3 map println list 二 函式型別的宣告,左邊是引數型別,右邊是方法返回值型別 val g int string myint val h unit 三 指定引數為call by name by name ...

shell中各種奇怪的符號整理

子shell中執行 數值比較,運算,支援正則 i 1 i 3 i commond1 commond2 命令替換 commond 支援運算 1 2 集合,可將命令與字串隔開 變數的引用 檔案測試,數值比較,檔案比較,字串比較 a 且,o 或 增加了對正則的支援,包含,或,且 支援變數運算 2 2 2 ...

那些年我看到的奇怪sql

基礎表 日誌表 臨時表 物件表 流水表 歷史記錄表 create table 顧客待裁決 顧客編號 int 11 unsigned not null auto increment,許可 varchar 20 default null,顧客姓名 varchar 30 default comment 姓...