回答
如果要指定可以使用的Option
類型:
無:選項[字符串]
冒號是明確的類型註釋。
您可以與scalaz:
import scalaz._
import Scalaz._
none[String] // res0: Option[String] = None
Option
是一個參數化的類型和被定義爲這樣:
... sealed abstract class Option[+A] ...
它被其他2類擴展:
final case class Some[+A](x: A) extends Option[A]
和
case object None extends Option[Nothing]
雖然Some
可以採取任何類型的參數,None
是一個Option
的特殊實例/單例,參數爲Nothing
。此外Option
在其類型參數[+A]
中是協變的,這意味着Option[Nothing]
可用於任何其他參數類型爲Option
的地方,因爲Nothing
擴展了Scala中的所有類型。因此,不需要創建任何其他值來表示Nothing
值,單身人士None
將足以滿足所有情況。
在可擴展性方面Option
是一個密封的抽象類,所以你不能擴展它。由於它們是案例類,因此無法擴展其子類Some
和None
。
通常,您甚至不需要嘗試寫入類似None[String]
的東西,因爲更具體的Option
類型是在上下文中的某處定義的。例如,作爲函數參數:
def f(o: Option[String]) = ...; f(None)
或細化:
val o: Option[String] = None
而且,你真的不在乎什麼類型的選擇是,如果它是一個Nothing
值,你不能無論如何都無法得到任何東西,它就像Java中的null
但具有Monadic行爲。
有人提到你可以在scalaz中做類似的事情:none[String]
。這只是一種語法糖,雖然非常方便,但在某些類型必須註釋的情況下,要減少冗長。它的定義是這樣的:
final def none[A]: Option[A] = None
感謝您的寫作 – jinglining
@Alkk Izmailov:標準庫中已存在'none'方法:'Option .empty'。 –
這不是我的方法,我從scalaz複製'none';) –
我很驚訝,沒有人提到的Option.empty
存在:
scala> Option.empty[String]
res0: Option[String] = None
注意,在許多情況下,簡單地使用None
其中一個Option[String]
預計將正常工作。 或者換句話說,(如圖阿列克謝Izmailov),以下是corrrect:
def f(o: Option[String]) = ...; f(None)
這是因爲None
延伸Option[Nothing]
,所以憑藉Option
是協變(和Nothing
作爲一個子類型的每個其他類型),None
對於任何T
總是與Option[T]
兼容。
這也是爲什麼類型歸屬也是一個精細的選擇項(在這裏你確實需要對選項的類型明確,通過例如,如果需要它來驅動類型推斷的情況下):
scala> None: Option[String]
res0: Option[String] = None
+1爲'empty' - 與scalaz沒有太大區別 –
是'Option.empty [Type]'是最佳做法。同樣,對於空列表,這樣的人應該做'List.empty [Type]' – samthebest
@samthebest'Option.empty'比顯式類型註釋更好嗎?只是好奇 – acjay
- 1. 編譯器不強制指定參數類型 - 這是一個錯誤還是預期的?
- 2. 你能告訴機器代碼指令是否可重定位?
- 3. 你可以告訴一個數組是否爲空
- 4. C++編譯器告訴我一個類型無法識別
- 5. 如何在編譯時告訴項目是程序還是庫?
- 6. 我可以告訴我的泛型,關於它應該只是一個函數?
- 7. 你可以告訴C++指針是否已被破壞?
- 8. 有一個模板參數可以是指針類型或非指針類型
- 9. 是否可以爲參數指定多個類型提示?
- 10. 我可以在編譯時告訴Boost.Phoenix lambda的一組特定輸入類型是否有效?
- 11. 參數類型可能不是指一個抽象類型
- 12. 你什麼時候可以聲稱你的程序是一個「編譯器」?
- 13. 是否可以告訴編譯器(msvc,gcc)單獨離開一個特定的寄存器?
- 14. 什麼是intptr_t,它是整型還是指針的類型?
- 15. JAXB編組場,它的類型是一個泛型類型參數
- 16. 這是一個C#4.0編譯器可選參數的bug嗎?
- 17. 這個java代碼編譯,但是是錯誤的。你能告訴我它有什麼問題嗎?
- 18. 任何一個可以告訴什麼類型的轉換是這樣的
- 19. 告訴scala編譯器這種類型的方法是什麼TableQuery [T]可以映射到somthing的屬性ID
- 20. 是否有一個winforms的工具,它可以告訴你什麼控制你的鼠標懸停在
- 21. AS3中有一個類告訴你URL協議的類型嗎?
- 22. Scala - 缺少參數類型 - 是否可以避免協助編譯器?
- 23. 告訴JAXB綁定編譯器包括
- 24. 是否有預編譯器定義,告訴我我正在編譯iOS?
- 25. 如何告訴編譯器「忽略」一個類?
- 26. 我可以指定一個C#類型參數只能是一個接口類型嗎?
- 27. 是否可以爲類型參數指定一個通用約束從另一個類型轉換?
- 28. 警告:當只有一個指定參數,它必須是一個數組
- 29. 我可以告訴一個表單是否是模板中的「編輯」表單?
- 30. 是否可以指定sbt使用的scala編譯器?
我知道你寫了,我的觀點是我是否可以指定類型爲無像:val a:None [String] = – jinglining