1. 程式人生 > >scala中None Null Nothing 和 Nil的區別

scala中None Null Nothing 和 Nil的區別

None是一個object,是Option的子型別,定義如下 


[java] view plain copy
 print?
case object None extends Option[Nothing] {  


  def isEmpty = true  


  def get = throw new NoSuchElementException("None.get")  


}  


scala推薦在可能返回空的方法使用Option[X]作為返回型別。如果有值就返回Some[x](Some也是Option的子類),否則返回None,例如 


[java] view plain copy
 print?
def get(key: A): Option[B] = {  


    if (contains(key))  


        Some(getValue(key))  


    else  


        None  


}  


獲得Option後,可以使用get獲得包含的值,或者使用getOrElse獲得預設值如果isEmpty為true。 


Null是所有AnyRef的子類,在scala的型別系統中,AnyRef是Any的子類,同時Any子類的還有AnyVal。對應java值型別的所有型別都是AnyVal的子類。所以Null可以賦值給所有的引用型別(AnyRef),不能賦值給值型別,這個java的語義是相同的。 null是Null的唯一物件。 


Nothing是所有型別的子類,也是Null的子類。Nothing沒有物件,但是可以用來定義型別。例如,如果一個方法丟擲異常,則異常的返回值型別就是Nothing(雖然不會返回) 


[java] view plain copy
 print?
def get(index:Int):Int = {  


    if(x < 0) throw new Exception(...)  


    else ....  


}  


if語句是表示式,有返回值,必然有返回值型別,如果x < 0,丟擲異常,返回值的型別為Nothing,Nothing也是Int的子類,所以,if表示式的返回型別為Int,get方法的返回值型別也為Int。 


Nil是一個空的List,定義為List[Nothing],根據List的定義List[+A],所有Nil是所有List[T]的子類。

相關推薦

scalaNone Null Nothing Nil區別

None是一個object,是Option的子型別,定義如下  [java] view plain copy  print? case object None extends Option[Nothing] {     def isEmpty = true     def

JSconst、varlet區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

淺談java的"=="eqals區別

short copy 覆寫 main 否則 變量 程序 bar gif 在初學Java時,可能會經常碰到下面的代碼: 1 String str1 = new String("hello"); 2 String str2 = new String("hello");

javaequals,hashcode==的區別

nat 等號 bsp alt star object 名稱 改變 set 1、== java中的數據類型,可分為兩類: 1.基本數據類型,也稱原始數據類型 byte,short,char,int,long,float,double,boolean 他們之間的比較,應用雙

Keiltranslate,buildrebuild區別

在Keil程式設計環境下,有三個按鈕Translate,Build,Rebuild三個選項編譯選項。 Translate是編譯當前改動的原始檔,在這個過程中檢查語法錯誤。但並不生成可執行檔案 Build是隻編譯工程中上次修改的檔案及其它依賴於這些修改過的檔案的模組,同時重新連結生成可執

scala的模式匹配樣例類

目錄 模式匹配 模式匹配中的守衛和變數 物件模式匹配 陣列模式匹配  列表模式匹配 元組模式匹配 樣例類(cass class) 匹配巢狀結構 Option的使用 偏函式 模式匹配 模式匹配是scala中的另一個特色,比java中的swi

JQuery的text(),html()val()區別

定義和用法 text() 方法方法設定或返回被選元素的文字內容 text()只輸出標籤內的文字內容,和js的innerText方法一樣 定義和用法 html() 方法返回或設定被選元素的內容 (inner HTML),包括標籤。 如果該方法未設定引數,則返回

JavaScriptbreak、continuereturn區別例項

在 JavaScript中break,continue和return 這三個關鍵字, 都有停止迴圈的功能,return 還有另外一個功能,就是函式返回語句,但是返回的同時也將函式停止。 下面介紹3個關鍵字在停止for迴圈中的區別: 1、break的用法 得到的結果是: 2、continue的用法

敏捷方法極限程式設計(XP)Scrum區別

敏捷開發的實踐有XP 和 Scrum,似乎很少有文章介紹這兩者的區別 \ XP Scrum 迭代週期 1-2周 2-4周 是否允許修改需求 在一個需要沒有實現的時候可以使用其他的需求將其替換,但是實現的時間是要相

springMVCweb.xml配置//*的區別

新建一個spring專案發現無法訪問到jsp頁面,靜態html也無法訪問,終於找到答案,原來是spring攔截配置的不對,一直寫的是這種配置,今天發現是不對的,好在找到了答案:) springmvc /* 一、我們都知道在基於Spring的Application中,需要在w

JAVA基礎--javaequals,hashcode==的區別

1、== 在談JAVA中使用 == 前首先要明白Java中的資料型別分為兩種,即基本資料型別和引用資料型別,在該兩種情況下使用 所代表的含義也是不同。 基本資料型別: Java中的基本資料型別包括四類八種,即 布林型:boolean(1/8Byte); 字元型:char(2 Byte 一個字

Scala的Option方法GetOrElse

對於some來說: 如果some指定了一個數,那從這裡面取getOrElse方法結果都是該指定的數,若Option為空,則取出的getOrElse值是後面的指定的值,與option無關。就是一個預設的預設值一樣。 Option[Int]是型別 Int的容器,更確切地說,你可以把它

jscontinue、breakreturn區別

很多人將continue、break和return混淆,不知道該怎麼用才對,下面我簡單講述一下這三個語句的作用; return:它是用在一個函式中的,他可以跳出這個迴圈(return後面的語句將不再執行),然後返回一個值(僅一個),如果你想返回多個值,那麼就要將多個值寫到一個物件中,

JavaScriptconst、varlet區別淺析

在JavaScript中有三種宣告變數的方式:var、let、const。下文給大家介紹js中三種定義變數的方式const, var, let的區別。 1.const定義的變數不可以修改,而且必須初始化。 ? 1 2 3 4 5 const

Jenkins高階篇之Pipeline實踐篇-2-groovy字串操作split()tokenize()區別

這篇來一個字串切割的練習,很多人知道字串切割是用split()方法,但是很少人知道在groovy中,有一個方法叫tokenize(),這兩個方法其實都可以實現字串切割,但是兩者還是有區別的,本篇就來學習和掌握兩者的共同點和區別。我也是,之前第一選擇就是使用split()函式,直到知道有token

java 字串比較用=equals區別

=:是比較兩個字串引用的地址是否相同,即是否指向同一個物件 equals方法:則比較字串的內容是否相同。 例如String a = "abc";     String b = "abc"; a == b返回true,a.equals(b)同樣返回true,這是為什

ORACLE---IF 分支 NULL判斷自己做的過程暴露的錯誤

  ---P1 DECLARE    V_NUMBER1 NUMBER;    V_NUMBER2 NUMBER;    V_Result  VARCHAR2(7); BEGIN    IF V_NUMBER1 < V_NUMBER2 THEN       V_Re

android gradle tools 3.X 依賴,implementation compile區別

前言 2017 年google 後,Android studio 版本更新至3.0,更新中,連帶著com.android.tools.build:gradle 工具也升級到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作為gradle 的編譯版

專案ibatis的isNotNullisNotEmpty區別

一個困擾了很久的問題原來是因為思想固化了,一直跟著別人的思路走。 先上程式碼: <isNotEmpty property="payNo">and tbd.order_id = #payNo

mysql的delete , drop truncate 區別

bubuko 連表 分享 區別 sql 不想 show 直接 cat 1、delete 和 truncate 僅僅刪除表數據,drop 連表數據和表結構一起刪除,打個比方,delete 是單殺,truncate 是團滅,drop 是把電腦摔了。 2、delete 是