gpt4 book ai didi

scala - new 关键字的异常使用

转载 作者:行者123 更新时间:2023-12-01 08:54:45 25 4
gpt4 key购买 nike

多亏了这个thread , 我关注了这个 link来自 Akos Krivach 的评论。

解决方案中的代码如下:

implicit def enhanceWithContainsDuplicates[T](s:List[T]) = new {
def containsDuplicates = (s.distinct.size != s.size)
}

assert(List(1,2,2,3).containsDuplicates)
assert(!List("a","b","c").containsDuplicates)

我从未见过在这种情况下使用 new 关键字。

谁能告诉我它是如何工作的?这种模式有名称吗?

干杯

最佳答案

它被称为匿名类在本例中扩展 AnyRef(又名对象)。当您需要滚动某个您不想声明的类实例时,将使用匿名类。编译器为你生成乱码类名:

val x = new { def foo = println("foo") } 
x: AnyRef{def foo: Unit} = $anon$1@5bdc9a1a

(看,右边的 $anon$1)

其实你可能在Java中看到过类似的代码:

Comparator<Integer> comp = new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer integer2) {
// ...
}
}

这段代码

implicit def enhanceWithContainsDuplicates[T](s:List[T]) = new {
def containsDuplicates = (s.distinct.size != s.size)
}

定义方法(将被隐式应用),当被调用时,实例化包装类或多或少等于以下内容:

class Wrapper(private val s: List[T]) {
def containsDuplicates = (s.distinct.size != s.size)
}

关于scala - new 关键字的异常使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23754494/

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