使用(显式)隐式参数调用方法时“散文”和“点符号”的差异

时间:2015-02-06 19:15:09

标签: scala syntax parameter-passing

我不是Scala专家,我对使用隐式参数调用方法的语法感到困惑。

这是我的情况:

我有这样的Spark RDD:

val myData: RDD[Array[String]] = ...

并为其定义了订购:

object MyOrdering extends Ordering[Array[String]] = ...

我想过滤这个RDD并根据我的订购获取RDD中的前n个条目。 Spark RDD有一种方法可以使用此签名获取前n个条目:

def top(num: Int)(implicit ord: Ordering[T]): Array[T] 

最初我试过这段代码

myData filter { D =>
  D(9) == "yes"
} top(50)(MyOrdering)

哪个失败并出现此错误:

error: Int(50) does not take parameters
    } top(50)(MyOrdering)

但是,此代码有效:

myData.filter(D => D(9) == "yes").top(50)(MyOrdering)

对于我的初学者来说,失败的代码示例和工作代码示例看起来是指定等效逻辑。我错了吗?我实际上在两个代码示例中做了哪些不同的事情?或者这是Scala编译器如何解析代码的问题?

1 个答案:

答案 0 :(得分:1)

当方法为arity-1(1参数列表)或arity-0(无参数列表)时,您只能用方法调用空格替换点.。例如,这无法编译:

class Foo {
    def baz(x: Int)(y: Int) = this
    def qux(x: Int) = this
}

(new Foo) baz(1)(1) //Does not compile
(new Foo).baz(1)(1) //Allowed
(new Foo) qux(1) //Allowed, since qux is arity-1
(new Foo).qux(1) //Also allowed, of course

当最后一个参数列表为implicit时,如果使用{{1}调用该方法,编译器可以将具有n参数列表的方法视为具有arity n-1的方法参数:

implicit

the style guide中阅读有关方法调用规则的更多信息。