【发布时间】:2019-06-24 11:27:42
【问题描述】:
我正在 Scala 中构建一个 DSL,为此,我需要存储一个类的“实例”(在本例中为 Parent),除了这些“实例”必须在运行时重新创建几次。因此,我存储的是“构造函数”——一个创建实例的 lambda。
考虑以下代码 - 假设 userVar 可以在运行时更改,并且在构造实例时必须使用更新后的值。
class Parent {
def func(param: Any): Unit = { ... }
}
class User {
def construct(constr: => Parent): ParentWrapper = { ... }
var userVar = 13
construct(new Parent {
func(1)
func(userVar)
}
construct(new Parent {
func(userVar)
}
}
表达我想要的更自然的方式是(使用上述定义):
class User {
var userVar = 13
object ObjectA extends Parent {
func(1)
func(userVar)
}
construct(ObjectA)
}
但是,这似乎是不可能的,因为ObjectA 是立即创建的,并且没有“构造函数”。
我在想,通过一些创造性地使用宏,我可以这样做:
class User {
var userVar = 13
constructMacro {
func(1)
func(userVar}
}
}
并让constructMacro 将代码转换为construct(new Parent {code block goes here})。
我该怎么做?
或者有没有更好的方法来避免尴尬的construct(new Parent{...}) 通话?我的要求是在User 类中的某个位置存储一个引用,我可以重复调用并获取Parent 定义的新实例,这些实例反映了它们构造中使用的新值——并且construct 调用理想情况下应该返回一个该引用的包装对象。
【问题讨论】:
-
您还可以注释变量(请参阅我的答案更新)。
标签: scala metaprogramming scala-macros