scala将多个函数调用参数合并到一个元组中 - 这可以被禁用吗?

Lan*_*uhn 7 syntax scala tuples tuple-packing

这是我项目中类型安全的麻烦违规,所以我正在寻找一种方法来禁用它.似乎如果函数采用AnyRef(或java.lang.Object),您可以使用任何参数组合调用该函数,Scala会将参数合并到Tuple对象中并调用该函数.

在我的情况下,该函数不期望一个元组,并在运行时失败.我希望在编译时捕获这种情况.

object WhyTuple {
 def main(args: Array[String]): Unit = {
  fooIt("foo", "bar")
 }
 def fooIt(o: AnyRef) {
  println(o.toString)
 }
}
Run Code Online (Sandbox Code Playgroud)

输出:

(foo,bar)
Run Code Online (Sandbox Code Playgroud)

ret*_*nym 7

这里根本没有暗示或Predef - 只是老式的编译器魔法.您可以在类型检查器中找到它.我现在无法在规范中找到它.

如果你有足够的动力,可以在编译器中添加-X选项来防止这种情况发生.

或者,您可以避免编写接受超类型的arity-1方法TupleN.


Fre*_*lam 1

编译能够解释没有圆括号的方法。所以 fooIt 中的圆括号表示元组。您的调用与以下内容相同:

fooIt( ("foo","bar") )
Run Code Online (Sandbox Code Playgroud)

话虽如此,如果您使用 Some(AnyRef) 或 Tuple1(AnyRef) 等包装器,则可以使该方法排除调用检索值。

  • 除非我遗漏了一些东西,否则这并不是一个答案,而是问题前提的总结。 (3认同)