2014-03-06 3 views
1

형식 클래스처럼 작동해야하는 컨텍스트 경계와 암시 적 매개 변수에 대해 읽습니다. 자주 사용되는 예는 Ordering[T]입니다.정상적인 매개 변수에 비해 "컨텍스트 바운드"된 스칼라의 장점은 무엇입니까?

foo[T](a: T, b: T)(implicit ord: Ordering[T]) 

설탕 그래서 난 내가 전에이 이해 생각이

ord.compare(a, b) 

같은 것을 할 수있는 몸에

foo[T : Ordering](a: T, b: T) 

, 지금은 그리기 해요 : 같은 뭔가 공백 ... 그냥 간단하게 넘는 이점은 무엇입니까? 함수에 물건을 건네줍니다. 예 :

foo[T](a: T, b: T, ord: Ordering[T]) 
/* or */ foo[T](a: T, b: T)(ord: Ordering[T]) 
foo(a, b, myOrdering) 
/* or */ foo(a, b)(myOrdering) 
+3

이 암시이기 때문입니다. 다른 암시 적 매개 변수를 명시 적으로 전달할 필요는 없습니다. –

답변

3

나는 아래에서 자세히 대답하려고합니다. 짧은 대답은 암시 적 값을 다른 메소드의 암시 적 매개 변수에 명시 적으로 전달하지 않아도된다는 것입니다.

컨텍스트 경계의 구문 설탕에 신경 쓰지 않아도 이해할 수 있으므로 그 부분은 건너 뜁니다.

두 가지 정렬 방법이 있다고 가정 해보십시오. 하나는 전체 배열을 정렬하고 다른 하나는 한 조각 만 정렬하는 것입니다. 주문 암시 적 가치가 있었다 거기 같은 암시 적 매개 변수를 대신한다면, 지금

sort[T](as: Array[T], ord: Ordering[T]): Unit = sort(as, 0, as.length, ord) 
sort[T](as: Array[T], from: Int, to: Int, ord: Ordering[T]): Unit = ??? 

:

sort[T](as: Array[T])(implicit ord: Ordering[T]): Unit = sort(as, 0, as.length/*)(ord*/) 
sort[T](as: Array[T], from: Int, to: Int)(implicit ord: Ordering[T]): Unit = ??? 

이나와 상황에 맞는 범위 :

sort[T:Ordering](as: Array[T]): Unit = sort(as, 0, as.length/*)(ord*/) 
sort[T:Ordering](as: Array[T], from: Int, to: Int): Unit = ??? 

그들은 다음과 같은 서명이 보시다시피, 우리는 일반적인 경우의 순서를 지정할 필요가 없었습니다. 매개 변수를 더 깊이 전달하면이를 상상할 수 있습니다. 이 경우 컨텍스트 바인딩이없는 선언은 좀 지루하지만 사용법은 더 쉽습니다.

은 (컨텍스트 인스턴스를 받고 완전성 행 : implicitly[Ordering[T]]를 어딘가에 ??? 구현.)

관련 문제