当前位置:  开发笔记 > 编程语言 > 正文

Scala:未指定的值参数证据$ 3

如何解决《Scala:未指定的值参数证据$3》经验,为你挑选了1个好方法。



1> Aldo Stracqu..:

错误信息确实有点误导; 原因是该函数udf采用隐式参数列表,但您传递的是实际参数.因为我不知道很多关于火花,并且由于udf签名是有点令人费解,我会尽力解释是怎么回事,有一个简单的例子.

实际上udf是一个给出一些显式参数的函数,一个隐式参数列表给你另一个函数; 让我们来定义给出下面的函数pivotT的,我们有一个隐含Ordering会给作为一个函数,使我们能够一分为二的序列,包含小于元素一个pivot,另一个包含元素是更大:

def buildFn[T](pivot: T)(implicit ev: Ordering[T]): Seq[T] => (Seq[T], Seq[T]) = ???

让我们省略实施,因为它并不重要.现在,如果我执行以下操作:

val elements: Seq[Int] = ???
val (small, big) = buildFn(10)(elements)

我将犯你在代码中显示的同样的错误,即编译器会认为我显式传递elements为隐式参数列表,这将无法编译.我的示例的错误消息将与您拥有的错误消息有所不同,因为在我的情况下,我错误地传递给隐式参数列表的参数数量与预期参数列表匹配,然后错误将是关于不排队的类型.

相反,如果我把它写成:

val elements: Seq[Int] = ???
val fn = buildFn(10)
val (small, big) = fn(elements)

在这种情况下,编译器将正确地将隐式参数传递给函数.我不知道有什么办法可以绕过这个问题,除非你想明确地传递实际的隐含参数,但我觉得它很难看并且并不总是实用的; 作为参考,这就是我的意思:

val elements: Seq[Int] = ???
val (small, big) = buildFn(10)(implicitly[Ordering[Int]])(elements)


在你的例子中,你也可以做`(buildFn(10)_)(elements)`或`buildFn(10).apply(elements)`.对于`udf`应用程序也可以这样做.
推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有