对Scala方法调用约定感到困惑,特别是Seq上的sum函数

Phu*_*ong 15 scala implicit parentheses

我正在使用新的Scala IDE(Eclipse 3.6.2 + Scala IDE 2.0.0 [Scala 2.9.0]),我尝试做一些像这样简单的事情:

(1 to 10).sum
Run Code Online (Sandbox Code Playgroud)

这很好,但我最近也做了很多Groovy,我自动写道:

(1 to 10).sum()
Run Code Online (Sandbox Code Playgroud)

第二个版本在IDE中给出了编译器错误,并显示以下消息:

方法总和的参数不够:(隐式数:数字[B])B.未指定的值参数num.

我在Scala API上看到有两个版本的sum,一个不带参数,另一个带上面隐含的.我是否必须在没有括号的情况下调用零参数方法?

oxb*_*kes 25

答案是,如果您指定的参数列表(即用括号),那么必须在它(更准确地,或者,那些没有默认值)指定参数.

如果省略参数为非空参数列表的parens implicit,则编译器可以为您注入它们(假设它可以在您的范围内找到相关的含义:如第一个示例中所示)

1 to 10 sum
Run Code Online (Sandbox Code Playgroud)

如果你想自己传递参数(在这个例子中没有必要这样做),那么你可以利用Predef.implicitly它基本上返回不明确的范围内隐含值(假设有一个).他们在这里的用途是:

(1 to 10).sum(implicitly[Numeric[Int]])
(1 to 10).sum[Int](implicitly)
Run Code Online (Sandbox Code Playgroud)

这在采用多个隐式参数的方法中尤其重要,您可能只希望覆盖一个隐式参数(然后可以使用implicitly其他参数).例如,在scalaz中

aFoldable.sum(implicitly, myMonoid) //uses implicit Foldable but bespoke monoid
Run Code Online (Sandbox Code Playgroud)

关于scaladoc 用例的问题 ; 这是一个幻像条目,向您展示如何使用隐式参数列表(否则可能令人困惑)方法.这个scaladoc条目的存在可以追溯到这个臭名昭着的问题.