为什么不一样呢?
Why is it not the same?
我是scala新手,有两段代码:
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
val sessionType = SessionType.fromValue(s.`type`)
r.`type` is sessionImageTypeValidators(sessionType)
}
和
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
}
我刚刚将 SessionType.fromValue(s.type)
复制到 func 调用中。
获取错误:
Error:(53, 5) not found: value r
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
Error:(53, 66) not found: value s
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
为什么第二个代码编译不通过?它仅适用于 val
这是因为 Accord 验证库的开发人员编写的宏。
和scalacOptions += "-Ymacro-debug-lite"
在build.sbt
第一段代码
private val uploadImageTypeValidator0 = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
val sessionType = SessionType.fromValue(s.`type`)
r.`type` is sessionImageTypeValidators(sessionType)
}
产生
Warning:scalac: performing macro expansion com.wix.accord.dsl.`package`.validator[(App.UploadImageRequest, App.DriverSession)](((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => {
val sessionType: App.SessionType = App.this.SessionType.fromValue(s.`type`);
{
com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(sessionType));
()
}
}
})) at source-/media/data/Projects/accord_validation_demo/src/main/scala/App.scala,line-6,offset=164
Warning:scalac:
Warning:scalac: new com.wix.accord.transform.ValidationTransform.TransformedValidator(new com.wix.accord.combinators.Conditional[(App.UploadImageRequest, App.DriverSession)](Seq(), None))
Apply(Select(New(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("transform")), TermName("ValidationTransform")), TypeName("TransformedValidator"))), termNames.CONSTRUCTOR), List(Apply(Select(New(AppliedTypeTree(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("combinators")), TypeName("Conditional")), List(TypeTree()))), termNames.CONSTRUCTOR), List(Apply(Ident(TermName("Seq")), List()), Ident(TermName("None"))))))
但是第二段代码
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
}
产生
Warning:scalac: performing macro expansion com.wix.accord.dsl.`package`.validator[(App.UploadImageRequest, App.DriverSession)](((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => {
com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
()
}
})) at source-/media/data/Projects/accord_validation_demo/src/main/scala/App.scala,line-11,offset=392
Warning:scalac:
Warning:scalac: new com.wix.accord.transform.ValidationTransform.TransformedValidator(new com.wix.accord.combinators.Conditional[(App.UploadImageRequest, App.DriverSession)](Seq(((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => true
case _ => false
}).$minus$greater({
final class $anon extends com.wix.accord.Validator[(App.UploadImageRequest, App.DriverSession)] {
def <init>() = {
super.<init>();
()
};
import com.wix.accord.DescriptionBuilders._;
def apply(x0: (App.UploadImageRequest, App.DriverSession)) = {
val validation[=13=] = com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
val path[=13=] = {
<synthetic> <artifact> val x = com.wix.accord.Descriptions.PatternMatch(on = com.wix.accord.Descriptions.Path(), value = x0, guard = scala.None);
com.wix.accord.Descriptions.Path(com.wix.accord.Descriptions.Generic("r.`type`")).$plus$colon(x)
};
validation[=13=](r.`type`).prepend(path[=13=])
}
};
new $anon()
})), None))
Apply(Select(New(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("transform")), TermName("ValidationTransform")), TypeName("TransformedValidator"))), termNames.CONSTRUCTOR), List(Apply(Select(New(AppliedTypeTree(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("combinators")), TypeName("Conditional")), List(TypeTree()))), termNames.CONSTRUCTOR), List(Apply(Ident(TermName("Seq")), List(Apply(Select(Function(List(ValDef(Modifiers(PARAM | SYNTHETIC), TermName("x0"), TypeTree(), EmptyTree)), Match(Ident(TermName("x0")), List(CaseDef(Apply(TypeTree().setOriginal(Select(Ident(scala), scala.Tuple2)), List(Bind(TermName("r"), Ident(termNames.WILDCARD)), Bind(TermName("s"), Ident(termNames.WILDCARD)))), EmptyTree, Literal(Constant(true))), CaseDef(Ident(termNames.WILDCARD), EmptyTree, Literal(Constant(false)))))), TermName("$minus$greater")), List(Block(List(ClassDef(Modifiers(FINAL), TypeName("$anon"), List(), Template(List(AppliedTypeTree(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TypeName("Validator")), List(TypeTree()))), noSelfType, List(DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))), Import(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("DescriptionBuilders")), List(ImportSelector(termNames.WILDCARD, -1, null, -1))), DefDef(Modifiers(), TermName("apply"), List(), List(List(ValDef(Modifiers(PARAM | SYNTHETIC), TermName("x0"), TypeTree(), EmptyTree))), TypeTree(), Block(List(ValDef(Modifiers(), TermName("validation[=13=]"), TypeTree(), Apply(Select(Apply(TypeApply(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("dsl")), termNames.PACKAGE), TermName("Contextualizer")), List(TypeTree())), List(Select(Ident(TermName("r")), TermName("type")))), TermName("is")), List(Apply(Select(This(TypeName("App")), TermName("sessionImageTypeValidators")), List(Apply(Select(Select(This(TypeName("App")), TermName("SessionType")), TermName("fromValue")), List(Select(Ident(TermName("s")), TermName("type"))))))))), ValDef(Modifiers(), TermName("path[=13=]"), TypeTree(), Block(List(ValDef(Modifiers(SYNTHETIC | ARTIFACT), TermName("x"), TypeTree(), Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("PatternMatch")), List(AssignOrNamedArg(Ident(TermName("on")), Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Path")), List())), AssignOrNamedArg(Ident(TermName("value")), Ident(TermName("x0"))), AssignOrNamedArg(Ident(TermName("guard")), Select(Ident(TermName("scala")), TermName("None"))))))), Apply(Select(Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Path")), List(Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Generic")), List(Literal(Constant("r.`type`")))))), TermName("$plus$colon")), List(Ident(TermName("x"))))))), Apply(Select(Apply(Ident(TermName("validation[=13=]")), List(Select(Ident(TermName("r")), TermName("type")))), TermName("prepend")), List(Ident(TermName("path[=13=]")))))))))), Apply(Select(New(Ident(TypeName("$anon"))), termNames.CONSTRUCTOR), List())))))), Ident(TermName("None"))))))
这里
val validation[=14=] = com.wix.accord.dsl.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
您可以看到 r
、s
超出他们的范围。
所以问题是 Accord 宏有错误。他们不期望像第二部分那样的代码,但期望像第一部分那样的代码。
我是scala新手,有两段代码:
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
val sessionType = SessionType.fromValue(s.`type`)
r.`type` is sessionImageTypeValidators(sessionType)
}
和
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
}
我刚刚将 SessionType.fromValue(s.type)
复制到 func 调用中。
获取错误:
Error:(53, 5) not found: value r
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
Error:(53, 66) not found: value s
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
为什么第二个代码编译不通过?它仅适用于 val
这是因为 Accord 验证库的开发人员编写的宏。
和scalacOptions += "-Ymacro-debug-lite"
在build.sbt
第一段代码
private val uploadImageTypeValidator0 = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
val sessionType = SessionType.fromValue(s.`type`)
r.`type` is sessionImageTypeValidators(sessionType)
}
产生
Warning:scalac: performing macro expansion com.wix.accord.dsl.`package`.validator[(App.UploadImageRequest, App.DriverSession)](((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => {
val sessionType: App.SessionType = App.this.SessionType.fromValue(s.`type`);
{
com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(sessionType));
()
}
}
})) at source-/media/data/Projects/accord_validation_demo/src/main/scala/App.scala,line-6,offset=164
Warning:scalac:
Warning:scalac: new com.wix.accord.transform.ValidationTransform.TransformedValidator(new com.wix.accord.combinators.Conditional[(App.UploadImageRequest, App.DriverSession)](Seq(), None))
Apply(Select(New(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("transform")), TermName("ValidationTransform")), TypeName("TransformedValidator"))), termNames.CONSTRUCTOR), List(Apply(Select(New(AppliedTypeTree(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("combinators")), TypeName("Conditional")), List(TypeTree()))), termNames.CONSTRUCTOR), List(Apply(Ident(TermName("Seq")), List()), Ident(TermName("None"))))))
但是第二段代码
private val uploadImageTypeValidator = validator[(UploadImageRequest, DriverSession)] { case (r, s) =>
r.`type` is sessionImageTypeValidators(SessionType.fromValue(s.`type`))
}
产生
Warning:scalac: performing macro expansion com.wix.accord.dsl.`package`.validator[(App.UploadImageRequest, App.DriverSession)](((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => {
com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
()
}
})) at source-/media/data/Projects/accord_validation_demo/src/main/scala/App.scala,line-11,offset=392
Warning:scalac:
Warning:scalac: new com.wix.accord.transform.ValidationTransform.TransformedValidator(new com.wix.accord.combinators.Conditional[(App.UploadImageRequest, App.DriverSession)](Seq(((x0: (App.UploadImageRequest, App.DriverSession)) => x0 match {
case (_1: App.UploadImageRequest, _2: App.DriverSession)(App.UploadImageRequest, App.DriverSession)((r @ _), (s @ _)) => true
case _ => false
}).$minus$greater({
final class $anon extends com.wix.accord.Validator[(App.UploadImageRequest, App.DriverSession)] {
def <init>() = {
super.<init>();
()
};
import com.wix.accord.DescriptionBuilders._;
def apply(x0: (App.UploadImageRequest, App.DriverSession)) = {
val validation[=13=] = com.wix.accord.dsl.`package`.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
val path[=13=] = {
<synthetic> <artifact> val x = com.wix.accord.Descriptions.PatternMatch(on = com.wix.accord.Descriptions.Path(), value = x0, guard = scala.None);
com.wix.accord.Descriptions.Path(com.wix.accord.Descriptions.Generic("r.`type`")).$plus$colon(x)
};
validation[=13=](r.`type`).prepend(path[=13=])
}
};
new $anon()
})), None))
Apply(Select(New(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("transform")), TermName("ValidationTransform")), TypeName("TransformedValidator"))), termNames.CONSTRUCTOR), List(Apply(Select(New(AppliedTypeTree(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("combinators")), TypeName("Conditional")), List(TypeTree()))), termNames.CONSTRUCTOR), List(Apply(Ident(TermName("Seq")), List(Apply(Select(Function(List(ValDef(Modifiers(PARAM | SYNTHETIC), TermName("x0"), TypeTree(), EmptyTree)), Match(Ident(TermName("x0")), List(CaseDef(Apply(TypeTree().setOriginal(Select(Ident(scala), scala.Tuple2)), List(Bind(TermName("r"), Ident(termNames.WILDCARD)), Bind(TermName("s"), Ident(termNames.WILDCARD)))), EmptyTree, Literal(Constant(true))), CaseDef(Ident(termNames.WILDCARD), EmptyTree, Literal(Constant(false)))))), TermName("$minus$greater")), List(Block(List(ClassDef(Modifiers(FINAL), TypeName("$anon"), List(), Template(List(AppliedTypeTree(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TypeName("Validator")), List(TypeTree()))), noSelfType, List(DefDef(Modifiers(), termNames.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))), Import(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("DescriptionBuilders")), List(ImportSelector(termNames.WILDCARD, -1, null, -1))), DefDef(Modifiers(), TermName("apply"), List(), List(List(ValDef(Modifiers(PARAM | SYNTHETIC), TermName("x0"), TypeTree(), EmptyTree))), TypeTree(), Block(List(ValDef(Modifiers(), TermName("validation[=13=]"), TypeTree(), Apply(Select(Apply(TypeApply(Select(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("dsl")), termNames.PACKAGE), TermName("Contextualizer")), List(TypeTree())), List(Select(Ident(TermName("r")), TermName("type")))), TermName("is")), List(Apply(Select(This(TypeName("App")), TermName("sessionImageTypeValidators")), List(Apply(Select(Select(This(TypeName("App")), TermName("SessionType")), TermName("fromValue")), List(Select(Ident(TermName("s")), TermName("type"))))))))), ValDef(Modifiers(), TermName("path[=13=]"), TypeTree(), Block(List(ValDef(Modifiers(SYNTHETIC | ARTIFACT), TermName("x"), TypeTree(), Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("PatternMatch")), List(AssignOrNamedArg(Ident(TermName("on")), Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Path")), List())), AssignOrNamedArg(Ident(TermName("value")), Ident(TermName("x0"))), AssignOrNamedArg(Ident(TermName("guard")), Select(Ident(TermName("scala")), TermName("None"))))))), Apply(Select(Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Path")), List(Apply(Select(Select(Select(Select(Ident(TermName("com")), TermName("wix")), TermName("accord")), TermName("Descriptions")), TermName("Generic")), List(Literal(Constant("r.`type`")))))), TermName("$plus$colon")), List(Ident(TermName("x"))))))), Apply(Select(Apply(Ident(TermName("validation[=13=]")), List(Select(Ident(TermName("r")), TermName("type")))), TermName("prepend")), List(Ident(TermName("path[=13=]")))))))))), Apply(Select(New(Ident(TypeName("$anon"))), termNames.CONSTRUCTOR), List())))))), Ident(TermName("None"))))))
这里
val validation[=14=] = com.wix.accord.dsl.Contextualizer[String](r.`type`).is(App.this.sessionImageTypeValidators(App.this.SessionType.fromValue(s.`type`)));
您可以看到 r
、s
超出他们的范围。
所以问题是 Accord 宏有错误。他们不期望像第二部分那样的代码,但期望像第一部分那样的代码。