gpt4 book ai didi

scala - 调用具有(显式)隐式参数的方法时 "prose"和 "dot notation"的差异

转载 作者:行者123 更新时间:2023-12-04 21:40:16 25 4
gpt4 key购买 nike

我不是 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编译器可以使用 n 处理方法参数列表就像它有 arity n-1如果使用 implicit 调用该方法争论:
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

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

关于scala - 调用具有(显式)隐式参数的方法时 "prose"和 "dot notation"的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com