у меня есть черта с типом члена, и хотят иметь макрос с подписью, содержащей этот тип:макросы Scala, относящиеся к типу члена
trait Foo {
class Bar[A] { ... }
def baz[A](x: Bar[A]): Bar[A] = macro bazImpl[A]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Bar[A]]) = ...
}
Это не работает, так как bazImpl
должны принадлежать либо статический (то есть нечлен) object
или к пакету макросов. Но ни в одном случае у меня нет foo: Foo
, поэтому я мог написать foo.Bar[A]
.
Один из способов я могу думать о том, чтобы использовать Foo#Bar[A]
и добавить слепки:
trait Foo {
class Bar[A] { ... }
def baz[A](x: Bar[A]): Bar[A] = Foo.baz1(x).asInstanceOf[Bar[A]]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Bar[A]]) = ...
}
object Foo {
def baz1[A](x: Foo#Bar[A]): Foo#Bar[A] = macro bazImpl[A]
def bazImpl[A: c.WeakTypeTag](c: blackbox.Context)(x: c.Expr[Foo#Bar[A]]): c.Expr[Foo#Bar[A]] = ...
}
Но я хотел бы избежать этого (и потому, что это не совсем типобезопасным и потому, что реальный случай является более сложным,). Любые альтернативы?
Можете ли вы создать вложенный объект-компаньон вместе с вложенным классом? Другими словами, создайте объект 'Bar', вложенный в функцию' Foo', которая содержит метод 'bazImpl'? –
@BenReich Как сказано, реализация макроса должна быть в объекте _static_. Объект, вложенный в 'Foo', не является статическим (как я понимаю, по крайней мере). –