2017-02-02 35 views
1

Option[String]Option[String] = None之間有什麼不同?我認爲選項類型默認爲None,如果沒有設置,但不是100%確定。想知道是否會有任何潛在的影響。我需要在Scala中初始化選項類型

例如:

case class User(name:Option[String]) 

會不會是不同

case class User(name:Option[String]=None) 
+1

你能舉一個例子嗎?你的'Option'是一個局部變量,一個成員還是其他什麼? – Suma

+0

'選項[A]'不是一個值。這是一種類型。默認情況下說它是「無」是沒有意義的。它被實例化後只有'Some [A]'或'None'。 – marstran

+0

@Suma編輯,謝謝。 –

回答

2

我想你會混淆兩個不同的概念:默認參數默認初始值

默認參數

在Scala中可以對方法和構造函數參數提供默認參數。它可以讓你跳過這些參數:

case class User(name:Option[String]=Some("Sam")) { 
    def say(greeting: String = "Hello"): String = greeting + " " + name 
} 

val u = new User 
println(u.say()) 

正如你所看到的,它無關OptionNone。它適用於任何類型(參見方法),是的,你必須指定默認自己,否則將無法編譯:

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

+0

感謝您的全面回答 –

1

你的假設是不正確。沒有標準的參數默認值;通常,聲明的參數也必須在調用方法或構造函數時明確提供。

但是,一個參數可以聲明爲可選的,並且在其聲明點提供一個默認值:當您使用其名稱和類型聲明一個參數,然後添加等號後跟一個靜態值時,參數變爲可選。如果省略,則會自動插入給定的靜態值。

這不僅適用於案例類,還適用於其他類型的構造函數和方法。

在第一個例子,你給了,像val user = User()聲明不會編譯,因爲name參數必須給出。

在第二個例子中,val user = User()編譯得非常好。在運行時,user.name將具有值None

+1

我認爲它已經在評論中回答。假設確實不正確,因爲'None'不是'Option [String]'的默認值。 – zhelezoglo

+0

@zhelezoglo這意味着,將不會有默認值自動分配給Option [String]。那是對的嗎? –

+0

@zhelezoglo感謝您的觀察!我糾正了答案;請檢查。 – Madoc