【问题标题】:Scala anonymous mixin?Scala匿名混合?
【发布时间】:2018-07-04 15:38:59
【问题描述】:

调试时我必须检查 scala.collection.GenSetLike 文件。我在界面中遇到了这么一点点代码:

trait GenSetLike[A, +Repr] 
extends GenIterableLike[A, Repr]
  with (A => Boolean)
  with Equals
  with Parallelizable[A, parallel.ParSet[A]] {
  ...
}

(A => Boolean) mix 是什么意思?我尝试使用各种关键字进行搜索,但找不到令人满意的内容。
此语法表示一个接受 A 并返回布尔值的函数,但我在 trait mixin 上下文中看不到含义...

我的第一个猜测是这与 constructorapply 之类的东西有关,但这只是一种直觉。

请教我!

【问题讨论】:

  • ... with Function1[A, Boolean] ...。另请注意,用户定义的二进制类型构造函数也可用于中缀表示法,例如trait <=[A, B] { def invert(b: B): A }; trait Foo[X, Y] extends (X <= Y)

标签: scala traits mixins


【解决方案1】:

Scala 中的Set 实现了Function1[A, Boolean] (A => Boolean) 接口覆盖applycontains 相同,因此Scala 中的集合可以用作函数。

> val s = Set(1,2,3) 
s: Set[Int] = Set(1, 2, 3)

> s(2) 
res1: Boolean = true

> s.apply(3) 
res2: Boolean = true

> s(23) 
res3: Boolean = false

顺便说一句,这就是 Set 不变的原因。

【讨论】:

    【解决方案2】:

    A => BooleanFunction1 trait 的语法糖

    Scala REPL

    scala> def f[A] = (a: A) => true
    f: [A]=> A => Boolean
    

    上面的lambda也可以写成

    scala> def f[A]: Function1[A, Boolean] = (a: A) => true
    f: [A]=> A => Boolean
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多