加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:31:01 所属栏目:安全 来源:网络整理
导读:我不是 Scala专家,我对使用隐式参数调用方法的语法感到困惑. 这是我的情况: 我有这样的Spark RDD: val myData: RDD[Array[String]] = ... 并为其定义了订购: object MyOrdering extends Ordering[Array[String]] = ... 我想过滤这个RDD并根据我的订购获取
我不是 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

当最后一个参数列表是隐式时,如果使用隐式参数调用该方法,则编译器可以将具有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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读