我不是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编译器如何解析代码的问题?
答案 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中阅读有关方法调用规则的更多信息。