Вы не можете обратиться к членам класса в конструкторе, потому что класс не был построен еще. то есть key
является членом A
, поэтому вы не можете ссылаться на key
в конструкторе класса. Однако вы можете использовать параметр по умолчанию в качестве анонимной функции:
scala> class A(i: I[Int])(implicit f: I[Int] => Int = { i: I[Int] => i.t })
defined class A
scala> new A(new I(2))
res1: A = [email protected]
Или, если вы хотите, чтобы сделать его немного более чистым, вы можете создать метод в сопутствующем объекте A
, и ссылаться на него.
case class A(i: I[Int])(implicit f: I[Int] => Int = A.key)
object A {
def key(i: I[Int]): Int = i.t
}
Или даже:
case class A(i: I[Int])(implicit f: I[Int] => Int) {
def this() = this(new I(0))(A.key)
}
object A {
def key(i: I[Int]): Int = i.t
}
Это ясно использовать такой подход, но реальный случай более осложнила, у меня есть несколько конструкторов, можно свести к минимуму копии кода. – kokorins
@kokorins Вы также можете поместить функцию в объект-компаньон класса. Это может сделать его более чистым. –