让我们说一个班级:
case class Foo(id: Int, name: String, note: Option[String] = None)
Run Code Online (Sandbox Code Playgroud)
自动生成的伴随对象中的构造函数和apply方法都有三个参数.通过反射查看时,标记了第三个参数(注释):
p.isParamWithDefault = true
Run Code Online (Sandbox Code Playgroud)
此外,通过检查,我可以找到在伴随对象中生成值的方法:
method <init>$default$3
Run Code Online (Sandbox Code Playgroud)
和
method apply$default$3
Run Code Online (Sandbox Code Playgroud)
哪两个都有:
m.isParamWithDefault = true
Run Code Online (Sandbox Code Playgroud)
但是,我无法在TermSymbol上找到任何关于notes参数的内容,它实际上指向了正确的方法来获取默认值,也没有找到上述MethodSymbols中指向参数的TermSymbol的任何内容.
是否有直接的方法将参数的TermSymbol与生成其默认值的方法相关联?或者我是否需要做一些像检查伴侣对象上的方法名称一样的事情?
我对这里的case类构造函数示例和常规方法感兴趣.
我想回答这个问题.
而不是写:
case class Person(name: String, age: Int) {
def this() = this("",1)
}
Run Code Online (Sandbox Code Playgroud)
我以为我会使用宏注释来扩展它:
@Annotation
case class Person(name: String, age: Int)
Run Code Online (Sandbox Code Playgroud)
所以我尝试DefDef在宏注释的impl中使用quasiquotes 将新构造函数添加为普通的,如:
val newCtor = q"""def this() = this("", 1)"""
val newBody = body :+ newCtor
q"$mods class $name[..$tparams](..$first)(...$rest) extends ..$parents { $self => ..$newBody }"
Run Code Online (Sandbox Code Playgroud)
但是这会返回一个错误: called constructor's definition must precede calling constructor's definition
有办法解决这个问题吗?我错过了什么?
谢谢你看看,朱利安
我有以下代码片段,我想改进:
final case class GenderOps[F[_]]()
(implicit xa: Transactor[F],
ev: Bracket[F, Throwable]) extends GenderDb[F] {
override def create: F[Int] =
sql"""
CREATE TABLE interests
(
id smallserial NOT NULL,
interest character varying(40) NOT NULL,
PRIMARY KEY (id)
)
""".update.run.transact(xa)
override def seed[L[_] : Foldable](v: L[Gender]): F[Int] = ???
Run Code Online (Sandbox Code Playgroud)
正如您在代码中看到的,case class参数为空。可以避免case class吗?
scala ×3
case-class ×1
constructor ×1
reflection ×1
scala-2.10 ×1
scala-cats ×1
scala-macros ×1