我不知道標準庫是否完全是null
-free,如果不是,會感興趣的是什麼合理的使用情況存在,其中返回null
比返回一些Option
實例更可取。哪個Scala方法返回null而不是Option,爲什麼?
回答
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]
,我不知道。
與'scala.xml.Elem'相關,該''scala.xml.Elem'需要一個'String'前綴值,對於沒有名稱空間前綴,該值應該爲'null'。再說一遍,爲什麼它不是'Option [String]'超出了我的意思。 – 2011-05-30 22:50:57
至少它一直很煩人.. – 2011-05-30 22:57:50
我想不出任何,所以我做了一個谷歌搜索的API(inurl:scala-lang.org/api返回+ null),它似乎沒有產生任何記錄的使用null。
可能存在som內部使用。我能想到的唯一理由是爲了避免額外的Some對象或與Java輕鬆集成。兩者似乎不太可能
由於Scala在大多數情況下都不使用'return',所以這個搜索並沒有多大用處。 – 2011-05-31 20:20:40
我不是在談論代碼返回,而是在評論中返回 – thoredge 2011-06-01 07:17:01
我在標準庫中使用的唯一地方是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
,表示不匹配組。
我真的很喜歡這樣一個事實,即正則表達式自動成爲模式匹配器,事實上,對於90%的情況,您想要一個直的'String';但由於Scala幾乎完全沒有奇怪的異常,如果他們使用'Option [String]'來保持一致性,這可能是一個好主意。在分析Json時,'Option [String]'和/或'List'會頻繁出現,我不認爲他們的意見很多,因爲我將它們用於理解。 – 2011-05-30 22:56:07
@Eugene提示:如果您指定了類型,那麼它將不匹配'null'。例如,'case number(intPart:String,decimalPart:String)'與上面的字符串不匹配。 – 2011-05-31 20:19:09
- 1. 爲什麼我的方法不會返回任何東西,而是返回null?
- 2. 爲什麼Tiff.Open方法總是返回NULL而不打開一個tiff文件?
- 3. 爲什麼getActualTypeArguments返回Object而不是Integer for Option [Int]?
- 4. 爲什麼listFiles()方法返回null?
- 5. Moq-mocked方法爲什麼返回null?
- 6. 爲什麼這個BufferedReader返回空字符串而不是null?
- 7. 爲什麼方法「組合」在Scala中返回Iterator而不是Stream?
- 8. 爲什麼Scala不可變的HashMap方法返回一個Map?
- 9. 爲什麼下面的函數返回null而不是1?
- 10. 爲什麼實體getter返回null而不是0?
- 11. 爲什麼COALESCE返回NULL而不是我需要的值?
- 12. 爲什麼glGetString(GL_VERSION)返回null /零而不是OpenGL版本?
- 13. 爲什麼創建空白矩陣返回null而不是0.0?
- 14. 爲什麼GetProcessImageFileName返回null而不是進程的地址?
- 15. 爲什麼ruby在rails上返回null而不是json對象
- 16. 爲什麼getElementByID返回Nothing而不是NULL
- 17. Objective-C方法返回NSDictionary而不是NSMutableDictionary。爲什麼?
- 18. 爲什麼此方法返回double.PositiveInfinity而不是DivideByZeroException?
- 19. 爲什麼Servlet.service()方法返回void而不是ServletResponse的實例?
- 20. 爲什麼getChild方法在ANTLR4中返回ParseTree而不是ParseRuleContext?
- 21. 爲什麼WCF/JSON不爲null返回值返回`null`?
- 22. 爲什麼null == myVar而不是myVar == null?
- 23. 爲什麼我的getString()方法總是返回null?
- 24. 爲什麼我的方法總是返回null?
- 25. 爲什麼在調用方法IQueryable.FirstOrDefault()時總是返回null?
- 26. 爲什麼Combobox.FindName()方法總是返回null?
- 27. 爲什麼返回-1而不是0?
- 28. 爲什麼String.Format(「%1s」,「」)不返回「」而是「」?
- 29. 爲什麼user.home返回「\」而不是「/」?
- 30. 返回值而不是null
返回'null'的唯一合理用例是當你使用一個庫,期望從回調中返回'null'作爲「無結果」的指示。在處理來自Scala代碼的遺留Java庫時,這往往是一個必要的罪惡。 – 2011-05-30 21:58:46
通常,Scala庫方法將返回Option,如果調用不當(例如,列表中的最後一個),將拋出異常。我不知道任何返回null。 – 2011-05-30 22:01:43