感谢thread,我在Akos Krivach的评论中遵循了这个link。
解决方案中的代码如下:
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
关键字。
任何人都可以告诉我它是如何工作的? 这个模式有名字吗?
干杯
答案 0 :(得分:6)
它就是所谓的匿名类,在这种情况下扩展AnyRef (又名Object)。当您需要滚动一些您不想声明的类实例时,将使用匿名类。编译器为您生成乱码类名称:
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)
}