Option[String]
和Option[String] = None
之间的区别是什么?我认为如果没有设置选项类型默认为None
,但不是100%肯定。想知道是否会有任何潜在的影响。
例如:
case class User(name:Option[String])
与
不同case class User(name:Option[String]=None)
答案 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())
如您所见,它与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
答案 1 :(得分:1)
您的假设不正确。参数没有标准默认值;通常,在调用方法或构造函数时,还必须显式提供声明的参数。
但是参数可以声明为可选,并在其声明点提供一个默认值:当您使用其名称和类型声明参数,然后添加等号后跟静态值时,则此参数成为可选的。如果省略,将自动插入给定的静态值。
这不仅适用于案例类,还适用于其他类型的构造函数和方法。
在您提供的第一个示例中,val user = User()
之类的语句无法编译,因为name
参数必须。
在第二个例子中,val user = User()
可以很好地编译。在运行时,user.name
的值为None
。