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中方法调用规则的更多信息. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |