【问题标题】:Scala: Why can I convert Int to Unit?Scala:为什么我可以将 Int 转换为 Unit?
【发布时间】:2011-03-31 14:42:44
【问题描述】:

我最近开始使用 Scala (2.8) 并注意到我可以编写以下代码(在 Scala 解释器中):

scala> var x : Unit = 10
x : Unit = ()

那里发生了什么并不明显。我真的没想到会看到任何对 Unit 的隐式转换。

【问题讨论】:

    标签: scala unit-type


    【解决方案1】:

    嗯,任何东西都可以转换为单位(这是它的目的)。您可以将 Unit 视为(子)类型格中的单位,这意味着它是所有事物的超类型。见Wikipedia article

    【讨论】:

    • 我不清楚你在这里的确切含义:Unit 实际上并不是 Scala 中类型 lattice 的最小元素,它是 Any 类型。据我所知,Unit 实际上在 Scala 中没有任何子类型,它被定义为“最终类 Unit 扩展 AnyVal”。 mkneissl 上面的回答似乎给出了这个工作的真正原因 - 隐式转换。你说的是(子)类型的格子是什么具体的意思吗?
    【解决方案2】:

    参见Scala Language Specification 2.8 版中的“6.26.1 值转换”部分

    ...

    Value Discarding. 如果e 有一些值类型并且期望的类型是Unit,则e 被转换 通过将其嵌入到术语 { e; () } 中来转换为预期的类型。

    ...

    【讨论】:

    • 请注意,您可以通过在 SBT 配置中使用 scalacOptions += "-Ywarn-value-discard" 来发出警告。
    【解决方案3】:

    任何东西都可以转换为单位。这对于支持仍然返回值但返回值经常被忽略的副作用方法非常必要。比如

    import java.util.{List =>JList}
    
    def remove2[A](foo: JList[A], a1:A, a2:A):Unit = {
        foo.remove(a1)
        foo.remove(a2)  //if you couldn't convert the (usually pointless) return value of remove to Unit, this wouldn't type
    }
    

    【讨论】:

    • 这不是真正的必要,但如果你通常想忽略返回值,它比显式这样做更方便。
    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 2010-12-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    相关资源
    最近更新 更多