我從Auxiliary Class Constructors文章中復制了以下代碼,粘貼到 Scastie 中,更改class為trait并將 Scala 版本設定為 3.1.0:
val DefaultCrustSize = 12
val DefaultCrustType = "THIN"
// the primary constructor
trait Pizza (var crustSize: Int, var crustType: String) {
// one-arg auxiliary constructor
def this(crustSize: Int) = {
this(crustSize, DefaultCrustType)
}
// one-arg auxiliary constructor
def this(crustType: String) = {
this(DefaultCrustSize, crustType)
}
// zero-arg auxiliary constructor
def this() = {
this(DefaultCrustSize, DefaultCrustType)
}
override def toString = s"A $crustSize inch pizza with a $crustType crust"
}
這是結果。它給出了以下錯誤:
org.scalameta.invariants.InvariantFailedException: invariant failed:
when verifying scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Template](templ)(scala.meta.Tree.classifiable[scala.meta.Template]).is[Template.Quasi](Template.this.Quasi.ClassifierClass[scala.meta.Template]).||(templ.stats.forall(((x$9: scala.meta.Stat) => scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](x$9)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Ctor](scala.meta.Ctor.ClassifierClass[scala.meta.Stat]).`unary_!`)))
found that scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Template](templ)(scala.meta.Tree.classifiable[scala.meta.Template]).is[Template.Quasi](Template.this.Quasi.ClassifierClass[scala.meta.Template]) is false
and also templ.stats.forall(((x$9: scala.meta.Stat) => scala.meta.classifiers.`package`.XtensionClassifiable[scala.meta.Stat](x$9)(scala.meta.Tree.classifiable[scala.meta.Stat]).is[Ctor](scala.meta.Ctor.ClassifierClass[scala.meta.Stat]).`unary_!`)) is false
where Template = scala.meta.Template$@7759c8f1
where templ = {
// one-arg auxiliary constructor
def this(crustSize: Int) = {
this(crustSize, DefaultCrustType)
}
// one-arg auxiliary constructor
def this(crustType: String) = {
this(DefaultCrustSize, crustType)
}
// zero-arg auxiliary constructor
def this() = {
this(DefaultCrustSize, DefaultCrustType)
}
override def toString = s"A $crustSize inch pizza with a $crustType crust"
}
at org.scalameta.invariants.InvariantFailedException$.raise(Exceptions.scala:19)
at scala.meta.Defn$Trait$.internal$247(Trees.scala:432)
at scala.meta.Defn$Trait$.apply(Trees.scala:425)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$traitDef$1(ScalametaParser.scala:4592)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.traitDef(ScalametaParser.scala:4570)
at scala.meta.internal.parsers.ScalametaParser.tmplDef(ScalametaParser.scala:4548)
at scala.meta.internal.parsers.ScalametaParser.defOrDclOrSecondaryCtor(ScalametaParser.scala:4201)
at scala.meta.internal.parsers.ScalametaParser.nonLocalDefOrDcl(ScalametaParser.scala:4172)
at scala.meta.internal.parsers.ScalametaParser$$anonfun$templateStat$1$1.applyOrElse(ScalametaParser.scala:5120)
at scala.meta.internal.parsers.ScalametaParser$$anonfun$templateStat$1$1.applyOrElse(ScalametaParser.scala:5114)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
at scala.meta.internal.parsers.ScalametaParser.statSeq(ScalametaParser.scala:5057)
at scala.meta.internal.parsers.ScalametaParser.templateStats(ScalametaParser.scala:5130)
at scala.meta.internal.parsers.ScalametaParser.templateStatSeq(ScalametaParser.scala:5110)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$templateBody$1(ScalametaParser.scala:4945)
at scala.meta.internal.parsers.ScalametaParser.inBraces(ScalametaParser.scala:800)
at scala.meta.internal.parsers.ScalametaParser.templateBody(ScalametaParser.scala:4945)
at scala.meta.internal.parsers.ScalametaParser.templateBodyOpt(ScalametaParser.scala:4953)
at scala.meta.internal.parsers.ScalametaParser.template(ScalametaParser.scala:4887)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$template$1(ScalametaParser.scala:4906)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
at scala.meta.internal.parsers.ScalametaParser.template(ScalametaParser.scala:4891)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$templateOpt$1(ScalametaParser.scala:4931)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
at scala.meta.internal.parsers.ScalametaParser.templateOpt(ScalametaParser.scala:4923)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$objectDef$1(ScalametaParser.scala:4682)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.objectDef(ScalametaParser.scala:4674)
at scala.meta.internal.parsers.ScalametaParser.tmplDef(ScalametaParser.scala:4558)
at scala.meta.internal.parsers.ScalametaParser.topLevelTmplDef(ScalametaParser.scala:4540)
at scala.meta.internal.parsers.ScalametaParser$$anonfun$topStat$1.applyOrElse(ScalametaParser.scala:5079)
at scala.meta.internal.parsers.ScalametaParser$$anonfun$topStat$1.applyOrElse(ScalametaParser.scala:5067)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
at scala.meta.internal.parsers.ScalametaParser.statSeq(ScalametaParser.scala:5057)
at scala.meta.internal.parsers.ScalametaParser.topStatSeq(ScalametaParser.scala:5066)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$batchSource$1(ScalametaParser.scala:5297)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
at scala.meta.internal.parsers.ScalametaParser.batchSource(ScalametaParser.scala:5256)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$source$1(ScalametaParser.scala:5239)
at scala.meta.internal.parsers.ScalametaParser.atPos(ScalametaParser.scala:888)
at scala.meta.internal.parsers.ScalametaParser.autoPos(ScalametaParser.scala:922)
at scala.meta.internal.parsers.ScalametaParser.source(ScalametaParser.scala:5238)
at scala.meta.internal.parsers.ScalametaParser.entrypointSource(ScalametaParser.scala:5244)
at scala.meta.internal.parsers.ScalametaParser.$anonfun$parseSource$2(ScalametaParser.scala:143)
at scala.meta.internal.parsers.ScalametaParser.parseRule(ScalametaParser.scala:53)
at scala.meta.internal.parsers.ScalametaParser.parseSource(ScalametaParser.scala:143)
at scala.meta.parsers.Parse$.$anonfun$parseSource$1(Parse.scala:29)
at scala.meta.internal.parsers.ScalametaParser$$anon$264.apply(ScalametaParser.scala:5308)
at scala.meta.parsers.Api$XtensionParseDialectInput.parse(Api.scala:25)
at scala.meta.parsers.Api$XtensionParseInputLike.parse(Api.scala:14)
at com.olegych.scastie.instrumentation.Instrument$.apply(Instrument.scala:199)
at com.olegych.scastie.instrumentation.InstrumentedInputs$.apply(InstrumentedInputs.scala:23)
at com.olegych.scastie.sbt.SbtProcess$$anonfun$4.applyOrElse(SbtProcess.scala:191)
at com.olegych.scastie.sbt.SbtProcess$$anonfun$4.applyOrElse(SbtProcess.scala:177)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:35)
at akka.actor.FSM.processEvent(FSM.scala:707)
at akka.actor.FSM.processEvent$(FSM.scala:704)
at com.olegych.scastie.sbt.SbtProcess.processEvent(SbtProcess.scala:64)
at akka.actor.FSM.akka$actor$FSM$$processMsg(FSM.scala:701)
at akka.actor.FSM$$anonfun$receive$1.applyOrElse(FSM.scala:695)
at akka.actor.Actor.aroundReceive(Actor.scala:539)
at akka.actor.Actor.aroundReceive$(Actor.scala:537)
at com.olegych.scastie.sbt.SbtProcess.aroundReceive(SbtProcess.scala:64)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:614)
at akka.actor.ActorCell.invoke(ActorCell.scala:583)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:268)
at akka.dispatch.Mailbox.run(Mailbox.scala:229)
at akka.dispatch.Mailbox.exec(Mailbox.scala:241)
at akka.dispatch.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at akka.dispatch.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at akka.dispatch.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at akka.dispatch.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
為什么?為什么它在第 1 行之后,這看起來非常好并且在我洗掉其余部分時被接受?“不變性失敗”是否意味著它是編譯器中的錯誤?(在這種情況下,許多其他編譯器添加到訊息中,鼓勵報告它。)
主要問題:
- 特征中是否允許輔助(或輔助 - IIUC 這兩個術語顯然可以互換使用,意思相同)構造??函式?
- 如果有,如何稱呼他們?
- 它們有什么用(或將是,或在另一種實際擁有它們的語言中)?
uj5u.com熱心網友回復:
關于trait引數的檔案只提到了trait引數,而不是trait建構式:
Scala 3 允許特征有引數,就像類有引數一樣。
它還鏈接到原始 SIP 檔案以供參考:
有關更多資訊,請參閱Scala SIP 25。
在SIP-25 – traitparameters 中,它說[大膽強調我的]:
在
ClassDef特性中,我們仍然不允許二級建構式。
但是,此限制并未反映在Syntax Summary 中,它實際上并未在語法上區分classes 和traits。因此,限制純粹是檔案之一,而不是語法規范。
所以,回答你的問題:
為什么?
因為您的代碼在語法上有效但在語意上無效,而 ScalaMeta 似乎不希望這種特定型別的語意無效。
為什么它在第 1 行之后,這看起來非常好并且在我洗掉其余部分時被接受?“不變性失敗”是否意味著它是編譯器中的錯誤?(在這種情況下,許多其他編譯器添加到訊息中,鼓勵報告它。)
這顯然不是編譯器中的錯誤,因為例外不是在編譯器中拋出的,而是在 ScalaMeta 中拋出的。
主要問題:
- 特征中是否允許輔助(或輔助 - IIUC 這兩個術語顯然可以互換使用,意思相同)構造??函式?
不可以。SIP-25 明確禁止它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/398500.html
下一篇:資料幀Spark的轉換
