下面是一个简单的例子:
val f: PartialFunction[Any, Unit] = (_: Any) match {
case Val(s) => println("Val" + s)
case Sup(l) => println("Sup" + l)
case t : Unit => println("Unit")
}
f() //prints Unit而且效果很好。但是,如果我用以下内容替换函数防御:
val f: PartialFunction[Any, Unit] = (_: Any) match {
case Val(s) => println("Val" + s)
case Sup(l) => println("Sup" + l)
case Unit => println("Unit")
}
f(Unit) //prints Unit
f() //throws scala.MatchError它的工作原理不同。
我不明白这种行为。如何将类型作为函数参数传递?对我(我来自Java)来说,这似乎很奇怪。
发布于 2016-08-12 09:34:52
在示例1中,您将匹配一个类型为Unit的值。只有一个这种类型的值:(),请参阅API文档。我不太清楚为什么可以编写f()而不是f(()),也许这只是语法糖。
在示例2中,您将匹配对象Unit。这个案子很不寻常,很可能不是你想要的。
发布于 2016-08-12 09:33:54
1.f() scala编译器将自动扩展为f((): Unit),您可以通过和西-9278验证它
case t : Unit => println("Unit: " + t)您可以认为(): Unit是一个空元组变量。所以当f()到case Unit时,它会抛出MatchError,这是由您传递一个变量引起的。
2.正如@devkat所说,Unit是一个对象:
object Unit extends AnyValCompanion {
def box(x: Unit): scala.runtime.BoxedUnit = scala.runtime.BoxedUnit.UNIT
def unbox(x: java.lang.Object): Unit = ()]
override def toString = "object scala.Unit"
}3.f(Unit)的意思是将Unit对象传递给pattern match。所以case Unit是匹配的。
发布于 2017-10-14 16:11:09
正如其他人所指出的:在本例中,f()实际上只是f( () )的内固定符号,这意味着在f ()示例中,我们要传递一个参数,即() (也就是说,我们没有传递任何参数)。
至于两个函数定义:
scala.Unit既是一个抽象类,也是一个对象单例。在第一个函数中,它是针对抽象类进行测试。在第二个函数中,它测试常量/单例对象。
如果我们试一试:
println( ().isInstanceOf[Unit]) // true
println( () == scala.Unit) //false
println( () == scala.runtime.BoxedUnit.UNIT) //true
println( scala.runtime.BoxedUnit.UNIT.isInstanceOf[Unit]) //true
println( scala.Unit.isInstanceOf[Unit]) //false产出如下:
true
false
true
true
false这表明
基于这些知识,在第二个函数中传递(),实际上是scala.runtime.BoxedUnit.UNIT,然后模式匹配尝试与scala.Unit对象匹配。它们不是相同的对象,所以失败了。
在第一个函数中,如果您执行了这个f(Unit)操作,它将抛出一个MatchError。理由是单位(对象)不是单位(抽象类)的一个实例。()是Unit (抽象类)的一个实例,因此它可以工作。
https://stackoverflow.com/questions/38913917
复制相似问题