相关疑难解决方法(0)

如何通过Scala反射访问默认参数值?

让我们说一个班级:

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类构造函数示例和常规方法感兴趣.

reflection scala scala-2.10

14
推荐指数
1
解决办法
3495
查看次数

如何使用宏注释向Scala案例类添加无参数构造函数?

我想回答这个问题.

而不是写:

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

有办法解决这个问题吗?我错过了什么?

谢谢你看看,朱利安

constructor scala case-class scala-macros scala-quasiquotes

7
推荐指数
1
解决办法
1707
查看次数

如何避免无参数案例类?

我有以下代码片段,我想改进:

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 scala-cats

1
推荐指数
1
解决办法
85
查看次数