Scala에서는 기존 또는 새로운 유형을 개조하기 위해 적어도 두 가지 방법을 사용할 수 있습니다. 를 사용하여 무언가를 정량화 할 수 있음을 표현하고 싶다고 가정합니다 Int
. 다음과 같은 특성을 정의 할 수 있습니다.
암시 적 변환
trait Quantifiable{ def quantify: Int }
그런 다음 암시 적 변환을 사용하여 예를 들어 문자열 및 목록을 수량화 할 수 있습니다.
implicit def string2quant(s: String) = new Quantifiable{
def quantify = s.size
}
implicit def list2quantifiable[A](l: List[A]) = new Quantifiable{
val quantify = l.size
}
이들을 가져온 후 quantify
문자열과 목록 에서 메서드 를 호출 할 수 있습니다 . 수량화 가능한 목록은 길이를 저장하므로 이후에 quantify
.
유형 클래스
대안은 Quantified[A]
어떤 유형 A
이 정량화 될 수 있음을 나타내는 "증인"을 정의하는 것입니다.
trait Quantified[A] { def quantify(a: A): Int }
우리는이 유형에 대한 클래스의 인스턴스 제공 String
하고 List
어딘가에.
implicit val stringQuantifiable = new Quantified[String] {
def quantify(s: String) = s.size
}
그런 다음 인수를 정량화해야하는 메서드를 작성하면 다음과 같이 작성합니다.
def sumQuantities[A](as: List[A])(implicit ev: Quantified[A]) =
as.map(ev.quantify).sum
또는 컨텍스트 바운드 구문을 사용합니다.
def sumQuantities[A: Quantified](as: List[A]) =
as.map(implicitly[Quantified[A]].quantify).sum
그러나 언제 어떤 방법을 사용합니까?
이제 질문이옵니다. 이 두 가지 개념을 어떻게 결정할 수 있습니까?
내가 지금까지 알아 차린 것.
유형 클래스
- 유형 클래스는 멋진 컨텍스트 바인딩 구문을 허용합니다.
- 유형 클래스를 사용하면 매번 사용할 때마다 새 래퍼 객체를 만들지 않습니다.
- 유형 클래스에 여러 유형 매개 변수가있는 경우 컨텍스트 바운드 구문이 더 이상 작동하지 않습니다. 정수뿐만 아니라 일반적인 유형의 값으로도 수량화하고 싶다고 상상해보십시오
T
. 유형 클래스를 만들고 싶습니다.Quantified[A,T]
암시 적 변환
- 새 객체를 생성했기 때문에 값을 캐시하거나 더 나은 표현을 계산할 수 있습니다. 그러나 여러 번 발생할 수 있고 명시 적 변환이 한 번만 호출 될 수 있으므로 이것을 피해야합니까?
답변에서 기대하는 것
두 개념의 차이가 중요한 하나 (또는 그 이상)의 사용 사례를 제시하고 내가 왜 다른 개념을 선호하는지 설명하십시오. 또한 두 개념의 본질과 서로 간의 관계를 설명하는 것은 예가 없어도 좋을 것입니다.