Scala 不同之处;散文;及;点符号;使用(显式)隐式参数调用方法时

Scala 不同之处;散文;及;点符号;使用(显式)隐式参数调用方法时,scala,syntax,parameter-passing,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)(implic

我不是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编译器如何解析代码的问题?

只有在方法为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
时,如果使用
implicit
参数调用方法,编译器可以将具有
n
参数列表的方法视为具有arity
n-1

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

implicit val y: Int = 1
(new Foo) baz(1) //Allowed
(new Foo).baz(1) //Also fine
(new Foo) baz(1)(2) //Still not allowed
(new Foo).baz(1)(2) //Still allowed

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

错误表示第一个方法的解析方式类似于
(myData filter{D=>D(9)==“yes”}top)(50(MyOrdering))
,其中
(50)
本身不作为方法参数。例如,使用
50(“Hello!”)
可以最低限度地再现报告的错误。也就是说,即使没有隐式(附加参数列表),它如何解析?或者仅仅是这个添加改变了语法行为吗?如果没有隐式参数列表,它可以正常工作,例如:
implicit val myorder:Ordering[Array[String]]=MyOrdering
myData filter{D=>D(9)==“yes”}top(50)一个没有spark的简单示例是
list(1,2,3,4)filter(>2)sortBy(*-1)(scala.math.Ordering.Int)
@user2864740是正确的,如果将整个表达式(隐式表达式除外)包装在parens中并强制编译器实现运算符优先级,则可以解决此问题