В нашей библиотеке у нас есть макрос, определенный следующим образом:
def extractNamed[A]: Any = macro NamedExtractSyntax.extractNamedImpl[A]
Этот макрос использует сигнатуру своего типа для возврата метода apply
, аргументы которого соответствуют методу apply
класса case, для которого он введен.
Идея состоит в том, что это позволяет пользователю нашей библиотеки использовать именованные параметры Scala следующим образом:
lazy val fruitExtractor = extractNamed[Fruit](
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
Однако, похоже, это не работает — вместо этого во время компиляции возвращается error: Any does not take parameters
.
Похоже, это вызвано SI-7914. потому что это работает, если пользователь явно вызывает применение, то есть:
lazy val fruitExtractor = extractNamed[Fruit].apply(
name = FruitTable.name,
juiciness = FruitTable.juiciness
)
Мы можем обойти это, просто переименовав возвращаемый метод во что-то разумное, но есть ли другой способ обойти это, не требуя явного вызова метода?