scala选项类型差异

G G*_*G G 1 scala option

传递两个参数与传递一个参数有什么区别?

val option1 = Option(String,String)
and
val option2 = Option(String)
Run Code Online (Sandbox Code Playgroud)

Tra*_*own 8

当您编写类似的内容时Option(1, 2),编译器首先将其解析为Option.apply(1, 2),然后当它看到Option伴随对象没有带有apply两个参数的方法时,它会自动将参数转换为元组:

scala> Option(1, 2)
res0: Option[(Int, Int)] = Some((1,2))
Run Code Online (Sandbox Code Playgroud)

它会做类似的东西Option(1, 2, 3),Option(1, 2, 3, 4)等等.

这称为自动翻译,仅适用于具有单个参数的方法.例如,以下内容将无法编译:

scala> def foo[T](t: T, u: T): T = t
foo: [T](t: T, u: T)T

scala> foo(1, 2, 3)
<console>:13: error: too many arguments for method foo: (t: T, u: T)T
       foo(1, 2, 3)
          ^
Run Code Online (Sandbox Code Playgroud)

这个"特性"是为了语法方便而提供的,它使Scala更接近(至少以表面的方式)到其他功能语言,其中元组和函数参数列表更加统一.但是很多人讨厌自动编译,因为这些东西在Scala中并没有实际统一,假装它们会导致令人困惑的代码和烦人的错误信息.如果你是这些人之一(我是),你可以打开-Ywarn-adapted-args编译器标志,当编译器尝试执行此操作时会给出警告:

scala> Option(1, 2)
<console>:12: warning: Adapting argument list by creating a 2-tuple: this may not be what you want.
        signature: Option.apply[A](x: A): Option[A]
  given arguments: 1, 2
 after adaptation: Option((1, 2): (Int, Int))
       Option(1, 2)
             ^
res0: Option[(Int, Int)] = Some((1,2))
Run Code Online (Sandbox Code Playgroud)

但这是一个品味问题.