我是否必须在Scala中初始化Option类型

时间:2017-02-02 12:21:19

标签: scala

Option[String]Option[String] = None之间的区别是什么?我认为如果没有设置选项类型默认为None,但不是100%肯定。想知道是否会有任何潜在的影响。

例如:

case class User(name:Option[String])

不同
case class User(name:Option[String]=None)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的假设不正确。参数没有标准默认值;通常,在调用方法或构造函数时,还必须显式提供声明的参数。

但是参数可以声明为可选,并在其声明点提供一个默认值:当您使用其名称和类型声明参数,然后添加等号后跟静态值时,则此参数成为可选的。如果省略,将自动插入给定的静态值。

这不仅适用于案例类,还适用于其他类型的构造函数和方法。

在您提供的第一个示例中,val user = User()之类的语句无法编译,因为name参数必须

在第二个例子中,val user = User()可以很好地编译。在运行时,user.name的值为None