不寻常地使用新关键字

cch*_*son 3 scala

感谢这个帖子,我从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)
Run Code Online (Sandbox Code Playgroud)

我从未见过new在此上下文中使用过该关键字.

任何人都可以告诉我它是如何工作的?这个模式有名字吗?

干杯

om-*_*nom 6

它就是所谓的匿名类,在这种情况下扩展了AnyRef(又名Object).当您需要滚动一些您不想声明的类实例时,将使用匿名类.编译器为您生成乱码类名称:

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

(见$anon$1右边)

实际上,您可能已经在Java中看到过类似的代码:

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

这个特殊的代码

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

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

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