首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PartialFunction接受单元

PartialFunction接受单元
EN

Stack Overflow用户
提问于 2016-08-12 08:56:28
回答 3查看 90关注 0票数 2

下面是一个简单的例子:

代码语言:javascript
复制
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

而且效果很好。但是,如果我用以下内容替换函数防御:

代码语言:javascript
复制
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)来说,这似乎很奇怪。

EN

回答 3

Stack Overflow用户

发布于 2016-08-12 09:34:52

在示例1中,您将匹配一个类型为Unit的值。只有一个这种类型的值:(),请参阅API文档。我不太清楚为什么可以编写f()而不是f(()),也许这只是语法糖。

在示例2中,您将匹配对象Unit。这个案子很不寻常,很可能不是你想要的。

票数 3
EN

Stack Overflow用户

发布于 2016-08-12 09:33:54

1.f() scala编译器将自动扩展为f((): Unit),您可以通过和西-9278验证它

代码语言:javascript
复制
case t : Unit => println("Unit: " + t)

您可以认为(): Unit是一个空元组变量。所以当f()case Unit时,它会抛出MatchError,这是由您传递一个变量引起的。

2.正如@devkat所说,Unit是一个对象:

代码语言:javascript
复制
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是匹配的。

票数 2
EN

Stack Overflow用户

发布于 2017-10-14 16:11:09

正如其他人所指出的:在本例中,f()实际上只是f( () )的内固定符号,这意味着在f ()示例中,我们要传递一个参数,即() (也就是说,我们没有传递任何参数)。

至于两个函数定义:

  • 第一条是:如果t instanceOf单元(类)匹配
  • 第二个问题是:如果t ==单位(常数)匹配

scala.Unit既是一个抽象类,也是一个对象单例。在第一个函数中,它是针对抽象类进行测试。在第二个函数中,它测试常量/单例对象。

如果我们试一试:

代码语言:javascript
复制
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

产出如下:

代码语言:javascript
复制
true
false
true
true
false

这表明

  • scala.Unit对象实际上与()不一样。
  • scala.Unit对象甚至不继承抽象类单元。
  • ()确实继承了抽象类单元。

基于这些知识,在第二个函数中传递(),实际上是scala.runtime.BoxedUnit.UNIT,然后模式匹配尝试与scala.Unit对象匹配。它们不是相同的对象,所以失败了。

在第一个函数中,如果您执行了这个f(Unit)操作,它将抛出一个MatchError。理由是单位(对象)不是单位(抽象类)的一个实例。()是Unit (抽象类)的一个实例,因此它可以工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38913917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档