2011-05-30 179 views
11

我不知道標準庫是否完全是null -free,如果不是,會感興趣的是什麼合理的使用情況存在,其中返回null比返回一些Option實例更可取。哪個Scala方法返回null而不是Option,爲什麼?

+0

返回'null'的唯一合理用例是當你使用一個庫,期望從回調中返回'null'作爲「無結果」的指示。在處理來自Scala代碼的遺留Java庫時,這往往是一個必要的罪惡。 – 2011-05-30 21:58:46

+0

通常,Scala庫方法將返回Option,如果調用不當(例如,列表中的最後一個),將拋出異常。我不知道任何返回null。 – 2011-05-30 22:01:43

回答

5

NamespaceBinding返回null爲本地命名空間或在下面的情況下一個未定義的輸入。

$ scala 
Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> (<foo/>).scope.getURI("something") 
res0: String = null 

爲什麼它使用的String代替Option[URI],我不知道。

+1

與'scala.xml.Elem'相關,該''scala.xml.Elem'需要一個'String'前綴值,對於沒有名稱空間前綴,該值應該爲'null'。再說一遍,爲什麼它不是'Option [String]'超出了我的意思。 – 2011-05-30 22:50:57

+0

至少它一直很煩人.. – 2011-05-30 22:57:50

-1

我想不出任何,所以我做了一個谷歌搜索的API(inurl:scala-lang.org/api返回+ null),它似乎沒有產生任何記錄的使用null。

可能存在som內部使用。我能想到的唯一理由是爲了避免額外的Some對象或與Java輕鬆集成。兩者似乎不太可能

+1

由於Scala在大多數情況下都不使用'return',所以這個搜索並沒有多大用處。 – 2011-05-31 20:20:40

+0

我不是在談論代碼返回,而是在評論中返回 – thoredge 2011-06-01 07:17:01

5

我在標準庫中使用的唯一地方是null是可選的正則表達式組。

scala> val number = """(\d+)(\.\d+)?""".r // matches digits optionally followed by a . and more digits 
number: scala.util.matching.Regex = (\d+)(\.\d+)? 
scala> "12" match { 
    | case number(intPart, decimalPart) => (intPart, decimalPart) 
    | } 
res0: (String, String) = (12,null) 

我想,這裏的理由是,你不希望使用Option[String]所有羣體。這會使代碼不必要地笨拙,如果一個組不是可選的。不幸的是,在編譯時並不知道一個組是否是可選的。因此,對於所有組而言,它可以是Option[String],也可以是null,表示不匹配組。

+2

我真的很喜歡這樣一個事實,即正則表達式自動成爲模式匹配器,事實上,對於90%的情況,您想要一個直的'String';但由於Scala幾乎完全沒有奇怪的異常,如果他們使用'Option [String]'來保持一致性,這可能是一個好主意。在分析Json時,'Option [String]'和/或'List'會頻繁出現,我不認爲他們的意見很多,因爲我將它們用於理解。 – 2011-05-30 22:56:07

+2

@Eugene提示:如果您指定了類型,那麼它將不匹配'null'。例如,'case number(intPart:String,decimalPart:String)'與上面的字符串不匹配。 – 2011-05-31 20:19:09

相關問題