scala中的结构匹配是什么

scala中的结构匹配是什么,scala,structural-typing,Scala,Structural Typing,scala中结构匹配的几个问题 问题1在下面的代码中,我是否能够将鸟和飞机传递给起飞,因为鸟和飞机在结构上与起飞所需的物体r匹配 import scala.language.reflectiveCalls case class Bird (val name: String) extends Object { def fly(height: Int):Unit = {println("bird fly")} } case class Plane (val callsign:

scala中结构匹配的几个问题

问题1在下面的代码中,我是否能够将鸟和飞机传递给起飞,因为鸟和飞机在结构上与起飞所需的物体r匹配

import scala.language.reflectiveCalls 

case class Bird (val name: String) extends Object {
        def fly(height: Int):Unit = {println("bird fly")}
}

case class Plane (val callsign: String) extends Object {
        def fly(height: Int):Unit = {println("plane fly")}
}

def takeoff(
            runway: Int,
      r: { val callsign: String; def fly(height: Int):Unit }) = {
  println(r.callsign + " requests take-off on runway " + runway)
  println(r.callsign + " is clear for take-off")
  r.fly(1000)
}
val bird = new Bird("Polly the parrot"){ val callsign = name }
val a380 = new Plane("TZ-987")
takeoff(42, bird)
takeoff(89, a380)
问题2什么是反射球?我必须导入scala.language.reflectiveCalls,否则我会得到警告:应该通过使隐式值scala.language.reflectiveCalls可见来启用结构类型成员值调用符号的反射访问

问题3我如何创建如下鸟:val Bird=new BirdPolly鹦鹉{val callsign=name}。难道不应该只有瓦尔·伯德=新鸟波利鹦鹉吗。这是怎么编译的

问题3.1。因为我已经传递了额外的{…},所以bird仍然是bird类型还是其他类型

4起飞时r的类型是什么

关于Q1:是的,它们在结构上与r的类型相匹配 关于Q2,请参见 关于Q3和3.1,请参见 关于Q4,r的类型为 例如,以下赋值将不会编译

val r: { val callsign: String; def fly(height: Int): Unit } = Bird("pigeon")
因为Birdpigeon没有呼号

请注意来自

结构类型在运行时通过反射实现,并且 固有性能低于标称类型

关于Q1:是的,它们在结构上与r的类型相匹配 关于Q2,请参见 关于Q3和3.1,请参见 关于Q4,r的类型为 例如,以下赋值将不会编译

val r: { val callsign: String; def fly(height: Int): Unit } = Bird("pigeon")
因为Birdpigeon没有呼号

请注意来自

结构类型在运行时通过反射实现,并且 固有性能低于标称类型

是的,见4

结构类型在背景中使用反射,所以速度很慢。reflectiveCalls导入用于警告用户此问题

当您添加细化{val callsign=name}时,您使用额外的字段callsign扩展了您的类型Bird,因此现在它的类型与r匹配,因为它同时具有callsign和fly

3.1鸟类类型为鸟类和结构性鸟类

val bird: Bird = new Bird("Polly the parrot"){ val callsign = name }
val birdRefined: Bird{ val callsign:String } = new Bird("Polly the parrot"){ val callsign = name }
val structuralBird: { val callsign: String; def fly(height: Int): Unit } = birdRefined
它被称为或在scala中

您可能还对这种子类型关系感兴趣

implicitly[Bird <:< { def fly(height: Int):Unit }]
//implicitly[Bird <:< { val callsign: String; def fly(height: Int):Unit }] -- fails. Not sybtype. 
implicitly[Plane <:< { val callsign: String; def fly(height: Int):Unit }]
implicitly[Bird {val callsign:String} <:< { val callsign: String; def fly(height: Int):Unit }]
是的,见4

结构类型在背景中使用反射,所以速度很慢。reflectiveCalls导入用于警告用户此问题

当您添加细化{val callsign=name}时,您使用额外的字段callsign扩展了您的类型Bird,因此现在它的类型与r匹配,因为它同时具有callsign和fly

3.1鸟类类型为鸟类和结构性鸟类

val bird: Bird = new Bird("Polly the parrot"){ val callsign = name }
val birdRefined: Bird{ val callsign:String } = new Bird("Polly the parrot"){ val callsign = name }
val structuralBird: { val callsign: String; def fly(height: Int): Unit } = birdRefined
它被称为或在scala中

您可能还对这种子类型关系感兴趣

implicitly[Bird <:< { def fly(height: Int):Unit }]
//implicitly[Bird <:< { val callsign: String; def fly(height: Int):Unit }] -- fails. Not sybtype. 
implicitly[Plane <:< { val callsign: String; def fly(height: Int):Unit }]
implicitly[Bird {val callsign:String} <:< { val callsign: String; def fly(height: Int):Unit }]

3.1不是很好的演示,因为这也适用于val bird2=新鸟。3.1不是很好的演示,因为这也适用于val bird2=新鸟。