2015-06-08 1 views
0

Можно ли выразить значение по умолчанию для неявного аргумента для класса?Поведение по умолчанию для неявных аргументов

class I[T](val t: T) 

class A(i: I[Int])(implicit f: I[Int] => Int) { 

    implicit object key extends(I[Int] => Int) { 
     def apply(i: I[Int])= i.t 
    } 

    def this() = this(new I(0))(key) 
} 

код выше, дает «Ошибка: не найдена: ключ значения»

ответ

3

Вы не можете обратиться к членам класса в конструкторе, потому что класс не был построен еще. то есть 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 
} 
+0

Это ясно использовать такой подход, но реальный случай более осложнила, у меня есть несколько конструкторов, можно свести к минимуму копии кода. – kokorins

+0

@kokorins Вы также можете поместить функцию в объект-компаньон класса. Это может сделать его более чистым. –