Option[String]
和Option[String] = None
之間有什麼不同?我認爲選項類型默認爲None
,如果沒有設置,但不是100%確定。想知道是否會有任何潛在的影響。我需要在Scala中初始化選項類型
例如:
case class User(name:Option[String])
會不會是不同
case class User(name:Option[String]=None)
Option[String]
和Option[String] = None
之間有什麼不同?我認爲選項類型默認爲None
,如果沒有設置,但不是100%確定。想知道是否會有任何潛在的影響。我需要在Scala中初始化選項類型
例如:
case class User(name:Option[String])
會不會是不同
case class User(name:Option[String]=None)
我想你會混淆兩個不同的概念:默認參數和默認初始值。
默認參數
在Scala中可以對方法和構造函數參數提供默認參數。它可以讓你跳過這些參數:
case class User(name:Option[String]=Some("Sam")) {
def say(greeting: String = "Hello"): String = greeting + " " + name
}
val u = new User
println(u.say())
正如你所看到的,它無關Option
和None
。它適用於任何類型(參見方法),是的,你必須指定默認自己,否則將無法編譯:
case class User(name:Option[String])
val u = new User
// Doesn't compile.
沒有,None
不是Option[A]
的默認值,當我們談論默認參數。您可以提供None
以及Option[A]
類型爲Option[A]
類型的參數的任何其他值,但你必須這樣做明確:
case class User(name:Option[String]=Some("Sam"))
case class User(name:Option[String]=None)
所以,談論參數的方法和構造,沒有默認值爲Option[A]
的值。你必須自己指定缺省值,否則它將不能編譯。
所以,從你的問題這兩條線確實是不同的:
case class User(name:Option[String])
case class User(name:Option[String]=None)
默認初始值
考慮以下代碼:
var name: Option[String] = _
println(name)
null
打印。因爲默認值是null
,而不是None
。這不僅適用於Option[A]
,而且適用於Scala中的所有AnyRef
類型。下面的打印null
之一:
var name: String = _
println(name)
請同時參閱Scala語言規範。例如。 https://www.scala-lang.org/files/archive/spec/2.11/04-basic-declarations-and-definitions.html#variable-declarations-and-definitions
感謝您的全面回答 –
你的假設是不正確。沒有標準的參數默認值;通常,聲明的參數也必須在調用方法或構造函數時明確提供。
但是,一個參數可以聲明爲可選的,並且在其聲明點提供一個默認值:當您使用其名稱和類型聲明一個參數,然後添加等號後跟一個靜態值時,參數變爲可選。如果省略,則會自動插入給定的靜態值。
這不僅適用於案例類,還適用於其他類型的構造函數和方法。
在第一個例子,你給了,像val user = User()
聲明不會編譯,因爲name
參數必須給出。
在第二個例子中,val user = User()
編譯得非常好。在運行時,user.name
將具有值None
。
我認爲它已經在評論中回答。假設確實不正確,因爲'None'不是'Option [String]'的默認值。 – zhelezoglo
@zhelezoglo這意味着,將不會有默認值自動分配給Option [String]。那是對的嗎? –
@zhelezoglo感謝您的觀察!我糾正了答案;請檢查。 – Madoc
你能舉一個例子嗎?你的'Option'是一個局部變量,一個成員還是其他什麼? – Suma
'選項[A]'不是一個值。這是一種類型。默認情況下說它是「無」是沒有意義的。它被實例化後只有'Some [A]'或'None'。 – marstran
@Suma編輯,謝謝。 –