Я использую синтаксический анализатор Scala следующим образом:
def a = b ~ c ^^ { case x ~ y => A(x,y) }
def b = ... { B() }
def c = ... { C() }
теперь у меня есть изменение функции, которое изменяется при разборе ссылки ранее проанализированного B
на val
в C
. Итак, конструктор C
выглядит примерно так:
C(ref:B)
Я могу себе представить, что единственный способ добиться этого - это грязная работа с патчем, назначив экземпляр анализируемого объекта B
для def c
между синтаксическим анализом a
. Примерно так:
var temp:B = null
def a = ( b ^^ { case x => temp = x } )
~ c(temp) ^^ {case x ~ y => A(x,y} )
Существует ли стандартный, чистый способ сделать это? Определение a
не может быть нарушено, оно используется во многих местах в остальном коде.
Другое решение - использовать var
вместо val
и иметь следующее:
def a = (b ~ c ) ^^ { case x ~ y => y.ref = c ; A(x,y) }
Но это также неприемлемо, так как сейчас это "сработало бы", но это потребовало бы дополнительных усилий и кода базовой платы в будущем развитии.
Я не тестировал этот код, так как это небольшая часть, и все изменения требуют больших усилий, поэтому сначала нужно получить мнение эксперта.