모든 컬렉션 유형에 대한 스칼라 컬렉션의 세계에는 컬렉션의 인스턴스를보다 쉽게 구성 할 수있는 도움이되는 객체가 있습니다.당신은 단지 다음 잘못된 것 Numeric("5.1")
를 작성하는 경우 클래스를 가지고 있다면
object Numeric {
def apply(s: String): Numeric = new Numeric(s.toDouble)
}
case class Numeric(v: Double)
: 편의상
는 같은 이름의 클래스와 객체를 고려한다. 객체를 사용하면 Numeric.apply("5.1")
또는 apply
이 special method이므로 실제로는 Numeric("5.1")
을 쓸 수 있습니다. Scala의 object
은 Java로 작성하는 모든 static
메소드를 보유하는 것과 유사합니다. 위로 예제
는
MyType
는
List[Int]
에만 유형의 별칭이며, 이름
MyType
과 범위에
List
동반자 개체를 가져 오지 않습니다. 귀하의 예는 동반자 개체가없는 예인
Numeric
과 같습니다.
내 대답은 1) MyType
이 별칭이고 2) 컬렉션 유형이 Int
으로 제한된다는 사실을 숨기는 동반자 개체를 생성하는 간단하고 일반적인 방법을 만드는 것입니다. 당신은 당신의 코드에서 이와 같은 유형의 별칭 많이 가지고 있다면 당신은 여기보다 일반적인 버전을 원하는 아마 것 :
import scala.collection.GenTraversable
import scala.collection.generic.GenericCompanion
class TypeCompanion[CC[X] <: GenTraversable[X], T](companion: GenericCompanion[CC]) {
type InnerType = CC[T]
def apply(elems: T*): InnerType = companion.apply(elems: _*)
def empty(): InnerType = companion.empty[T]
}
object MyType extends TypeCompanion[List, Int](List)
type MyType = MyType.InnerType
당신이 List
쓰기 횟수를 줄이려면, 그리고 상관하지 않습니다 당신은 몇 가지 다른 유형 Int
에서 변경해야하는 경우 여분의 입력은, 당신이 변화를 선호 할 수 있습니다 :
class TypeCompanion[CC[X] <: GenTraversable[X]](companion: GenericCompanion[CC]) {
type InnerType = CC[Int]
def apply(elems: Int*): InnerType = companion.apply(elems: _*)
...
}
object MyType extends TypeCompanion(List)
type MyType = MyType.InnerType
모두 구현이 foo
방법이 구현 제공 :
def foo(x: MyType): MyType = {
if (x.head == 0) MyType()
else if (x.head == -1) MyType(1,2,3,4)
else x
}
을
GenTraversable
및 GenericCompanion
의 형식 제한은 스칼라 컬렉션의 규칙과 일치하는 개체를 컴패니언 개체로 제한하는 데 유용합니다.
당신은 내 대답이 당신이 요구 한 것을 제공한다는 것을 알지만, 당신이 선택한 대답은 그렇지 않습니다 ... 맞습니까? – Nate
예 대답은 요청 된 명시적인 결과를 제공하지만, 그것이 어떻게 성취되었으며, 왜 필요한지에 대해서는 거의 설명하지 않습니다. 당신의 대답은 또한 왜 원하는 해결책이 가능하지 않은지에 대한 설명을 제공하지 않습니다. 아마도 나는 내 질문을 부적절하게 표현했다. 이 경우에 _why_는 _how_보다 더 관련이 있습니다. – cheezsteak
귀하의 질문에 나타나지 않았거나 그렇지 않은 경우 답변을 드릴 수 없었습니다. 선택한 대답조차도 유형 대 동반자 객체의 패턴을 설명하지 않습니다. – Nate