Рассмотрим следующую ситуацию:
trait M { } // uses N
object M { def apply = new M { } }
trait N { self: L => }
trait L { val m: B }
type B
M нужны новые определения деревьев, созданные в N. Я не хочу передавать эти новые деревья, потому что иерархия классов на самом деле очень длинная и может привести к значительному изменению кода. Вместо этого мне предложили сделать:
trait M { self: N with L => } // uses N
object M { def apply = new M with N with L { } }
trait N { self: L => }
trait L { val m: B }
type B
но тогда я получаю ошибку:
создание объекта невозможно, так как значение m в признаке L типа B не является
определен
это исходит из определения объекта М. Я пробовал разные комбинации, и ни одна из них не работает.
Как я могу решить эту ошибку?
Обсуждение
Я узнаю, что при написании new M {}
я получаю анонимный класс, расширяющий (объект ??) M, поэтому я попытался изменить его на new M with N with L {}
, но затем я получаю ошибку невыполненных членов от L.
Ссылки
Более подробную информацию о проблеме вы можете найти в этом коммите . А именно, тип M - это MeasureAnnotation, N - это StructuralSize, а L - это SolverProvider.
Если вы хотите собрать программу, вам нужно выполнить git clone, а затем запустить sbt
, а затем universal:stage
. Вам нужно установить z3 или cvc4.