使用 Scala2,我可以实现宏并使用tq准引用语法生成类型,例如:
q"""
new Foo {
type Bar = ${tq"(..$params)"}
}
"""
Run Code Online (Sandbox Code Playgroud)
我可以用这种语法做两件事 -
Bar基于params.params。如何使用 Scala 3 实现这一目标?
在带有 Scala 的代码库中工作,它希望您为某些类定义一种“制作新版本” - 例如,如果您有一个类 x(a :int, b:String, c:double).. . 它会有这样的功能:
class x( a: Integer, b : String, c : Double) extends CanMakeNew
{
def newValue() = x( a, b, c)
}
Run Code Online (Sandbox Code Playgroud)
我无法控制它 - 但不想每次都实现它。或者,嗯……永远。在 Scala 中有一种方法可以通过反射来迭代构造函数参数值吗?我可以使用反射来查看参数类型- 但由于该模块的参数名称尚未打开,我无法打开它 - 我无法将这些与类中存储的值相关联。从根本上说,我正在寻找实现以下特征的方法:
trait CanMakeNewDoneForMe extends CanMakeNew {
def newValue() {I need the code that goes here}
Run Code Online (Sandbox Code Playgroud)
那么scala反射有没有办法检查构造函数或检查对象并看到“啊,这是构造函数中的第三个参数”?
我有一个工作宏,即:
object Main extends App {
println("Testing assert macro...")
val result = Asserts.assert(false, "abc")
}
Run Code Online (Sandbox Code Playgroud)
和
import scala.reflect.macros.blackbox.Context
import scala.language.experimental.macros
object Asserts {
val assertionsEnabled: Boolean = true
def assert(cond: Boolean, msg: String): Unit = macro assertImpl
def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[String]) : c.Expr[Unit] = {
import c.universe._
cond.tree match {
case Literal(Constant(cond: Boolean)) =>
if (!cond) c.abort(c.enclosingPosition, "Fix the code, whatever.") else c.Expr(q"()")
}
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是:我怎样才能做到这一点?:
val cond: Boolean = false
val result = Asserts.assert(cond, "abc")
Run Code Online (Sandbox Code Playgroud)
现在我有一个错误: …
我正在尝试编写一个宏,它返回作为类型参数传递的文字类型的值,如果参数不是文字类型,则无法编译。这里有些例子:
def literalValue[SC <: String] = //...
literalValue["AB"] // returns "AB"
literalValue["C"] // returns "C"
literalValue[String] // compile error
Run Code Online (Sandbox Code Playgroud)
所以我从常规的宏样板开始,遇到了以下问题:
def implStringLiteral[SC <: String: c.WeakTypeTag](c: blackbox.Context): c.Expr[SC] = {
import c.universe._
val symbol = weakTypeOf[SC].typeSymbol //It is String
//...
}
Run Code Online (Sandbox Code Playgroud)
看起来文字类型本身是作为常规传递的String,因此无法通过其 获得精确的类型信息WeakTypeTag。
有什么解决方法可以解决这个问题吗?