2011-10-31 4 views
7

두 암시 인수는 나는 다음과 같은 클래스가 : 스칼라 : 같은 선언

class Example(implicit doSomething1: (Double, Double) => Double, implicit doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

생성자가 같은 선언이 개 암시 적 인수 (함수)가보다시피

. 하지만 나는 두 가지 다른 정의를 "주입"하고 싶다. 이것이 암시 적으로 가능합니까? 또는 알려진 명시적인 방식으로 만 가능합니까?

감사

답변

0

쓰기

class Example(implicit doSomething1: (Double, Double) => Double, doSomething2: (Double, Double) => Double) 
{ 
    //.. 
} 

그러나이 개 암시 인수가 동일한 유형이있는 경우, 그들은 분명히 같은 값을 (당신은 여전히 ​​명시 적으로 다른 인수를 전달할 수 있습니다)해야합니다

.

8

컴파일러가 암시 적 범위에서 implicit (Double, Double) => Double을 찾으면 더 높은 우선 순위를 가진 정확히 하나가 있고 둘 중 하나를 선택하거나 그렇지 않은 경우 (암시 적 범위에 아무 것도 없거나 하나는 우선 순위가 가장 높음) 암시적인 값이 부족하다는 오류가 발생합니다.

구분하려면 두 가지 유형이 있으며 둘 다 Function2 [Double, Double, Double]를 확장하십시오. 예를 들어

trait Addition extends Function[Double, Double, Double] 
trait Multiplication extends Function[Double, Double, Double] 
class Example(implicit addition: Addition, implicit multiplication: Multiplication) 

두 작업을 독립적으로 선택하는 것이 좋습니다. 두 가지 선택이 conistent해야하는 경우, 당신이 "자연스럽게"암시 적 범위에 적절한 작업을 얻을 경우에만 마지막으로,이 모든 것이 유용하다 모두 작동

trait Ring { 
    def add(x: Double, y: Double): Double 
    def mult(x: Double, y: Double): Double 
} 
// or `case class Ring(
//  addition: (Double, Double) => Double, 
//  multiplication: (Double, Double) => Double) 
class Example(implicit ring: Ring) 

로 한 특성을 가지고 더 적합 할 수 있습니다.

implicit val addition = ... 
implicit val multiplication = 
new Example 

과 같이 예를 만들 때마다 암시 적으로 지정해야 할 수도 있습니다. 전화의 대부분은 같은 값으로 작동 할 것으로 예상하고, 경우

또한, 당신은 단지 그들 중 몇 가지를 변경하려면, 당신은 오히려 기본 값으로 인수 갈 수도

class Example(doSomething1 : (Double, Double) => Double = <default value>, doSomething2 ...) 

당신은 할 수 있습니다 이 두 가지 모두 기본값을 갖는 암시적인 인수입니다. 그렇게하면 암시 적이 발견되지 않을 때 기본값이 사용됩니다.