Я создаю DSL в Scala, и для этого мне нужно хранить «экземпляры» класса (в данном случае Parent
), за исключением того, что эти «экземпляры» необходимо создавать несколько раз во время выполнения.Поэтому вместо этого я храню «функции конструктора» - лямбду, которая создает экземпляр.
рассмотрим следующий код - представьте, что 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
должен возвращатьобъект-оболочка для этой ссылки.