scala选项类型差异
scala Option type difference
传递两个参数与传递一个参数有什么区别?
val option1 = Option(String,String)
and
val option2 = Option(String)
Option.apply
没有两个参数的重载,所以两者之间的简单区别是第一个给出与参数数量相关的错误:
error: too many arguments (2) for method apply: (x: A)Option[A] in object Option
而第二个给出错误,因为 String
是一种类型,而不是值,而您正试图将类型作为参数传递,这是不可能的:
error: object java.lang.String is not a value
当你写类似 Option(1, 2)
的东西时,编译器首先将其脱糖为 Option.apply(1, 2)
,然后当它发现 Option
伴随对象没有 [=16] =] 方法接受两个参数,它会自动将参数转换为元组:
scala> Option(1, 2)
res0: Option[(Int, Int)] = Some((1,2))
它会为 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)
^
提供此 "feature" 是为了语法方便,它使 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))
不过,这是一个品味问题。
传递两个参数与传递一个参数有什么区别?
val option1 = Option(String,String)
and
val option2 = Option(String)
Option.apply
没有两个参数的重载,所以两者之间的简单区别是第一个给出与参数数量相关的错误:
error: too many arguments (2) for method apply: (x: A)Option[A] in object Option
而第二个给出错误,因为 String
是一种类型,而不是值,而您正试图将类型作为参数传递,这是不可能的:
error: object java.lang.String is not a value
当你写类似 Option(1, 2)
的东西时,编译器首先将其脱糖为 Option.apply(1, 2)
,然后当它发现 Option
伴随对象没有 [=16] =] 方法接受两个参数,它会自动将参数转换为元组:
scala> Option(1, 2)
res0: Option[(Int, Int)] = Some((1,2))
它会为 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)
^
提供此 "feature" 是为了语法方便,它使 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))
不过,这是一个品味问题。