【发布时间】:2011-03-31 14:42:44
【问题描述】:
我最近开始使用 Scala (2.8) 并注意到我可以编写以下代码(在 Scala 解释器中):
scala> var x : Unit = 10
x : Unit = ()
那里发生了什么并不明显。我真的没想到会看到任何对 Unit 的隐式转换。
【问题讨论】:
我最近开始使用 Scala (2.8) 并注意到我可以编写以下代码(在 Scala 解释器中):
scala> var x : Unit = 10
x : Unit = ()
那里发生了什么并不明显。我真的没想到会看到任何对 Unit 的隐式转换。
【问题讨论】:
嗯,任何东西都可以转换为单位(这是它的目的)。您可以将 Unit 视为(子)类型格中的单位,这意味着它是所有事物的超类型。见Wikipedia article。
【讨论】:
参见Scala Language Specification 2.8 版中的“6.26.1 值转换”部分:
...
Value Discarding. 如果e 有一些值类型并且期望的类型是Unit,则e 被转换
通过将其嵌入到术语 { e; () } 中来转换为预期的类型。
...
【讨论】:
scalacOptions += "-Ywarn-value-discard" 来发出警告。
任何东西都可以转换为单位。这对于支持仍然返回值但返回值经常被忽略的副作用方法非常必要。比如
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
}
【讨论】: