【问题标题】:How does implicit conversion work in Scala?Scala 中的隐式转换是如何工作的?
【发布时间】:2014-10-01 00:26:02
【问题描述】:

给定以下类型定义:

type Set = Int => Boolean

我可以声明一个以两种方式返回 Set 的函数

def singletonSet(elem: Int): Set = 
  value => value == elem

def singletonSet(elem: Int): Set =
  Set(elem)

第二个定义使用 Scala 标准库中的 Set 而不是声明的类型,但是 Scala 是如何隐式转换为声明的类型 Set 的呢?隐式转换对我来说似乎很奇怪。

为了澄清第二个定义,我在以下有效代码中更改了类型的名称:

type SetX = Int => Boolean

def singletonSet(elem: Int): SetX =
    Set(elem)

【问题讨论】:

    标签: scala


    【解决方案1】:

    Set[A] extends A => Boolean,所以没有隐式转换,只是子类型化。

    【讨论】:

      【解决方案2】:

      Set 有一个应用函数 A => Boolean,对于每个 A,如果它存在于 Set 中则返回 true,否则返回 false(它调用“contains”函数)。比如:

      val sx = Set(1,2,3)
      sx(1) // true
      sx(5) // false
      

      在 singletonSet 中,您创建一个带有一个元素的 Set[Int] 并返回“apply”函数。
      所以实际上,singletonSet 可以定义为:

      def singletonSet(elem: Int) = Set(elem).contains _
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        • 2018-09-16
        • 1970-01-01
        • 2018-11-19
        相关资源
        最近更新 更多