Это не может быть сделано обычной функцией. С классами наблюдений вы знаете, что вы просто храните значения и что эти значения уже вычислены, они не являются чем-то вроде lazy val
или def
, что может привести к сбою, если вы их запустите, и бесформенное может основываться на этом предположении, чтобы смело упакуйте эти значения в некоторые другие структуры, которые легко объединить.
Если вы хотите сделать то же самое с чертами, и вернуть немного A with B
, вам, по сути, придется построить макрос, который принимает A
instance, B
instance, и объединяет их - что будет иметь много угловых случаев (например, что, если обе черты имеют одинаковые имена методов / значений, но с разными типами результатов? Или что, если обе имеют одинаковое значение с одинаковыми name - что следует использовать?).
К сожалению, я не могу найти такой макрос нигде, поэтому его нужно было бы написать. Большинство людей просто сливают эти черты вручную так:
val ab: A with B = new (A with B) {
override val a: String = a.a
override val b: String = b.b
}