scala中的结构匹配是什么
scala中结构匹配的几个问题 问题1在下面的代码中,我是否能够将鸟和飞机传递给起飞,因为鸟和飞机在结构上与起飞所需的物体r匹配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:
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=新鸟。