2012-04-16 27 views
5

Phương pháp tùy chọn là phương pháp có thể được áp dụng nếu các lớp generics có loại cụ thể. ví dụ:Cách tốt nhất để xác định loại phương pháp tùy chọn an toàn trong Scala là gì?

list.unzip //works only if this is collection of pairs 
list.sum //works only if this collection of numbers 

Hiện nay tôi muốn thực hiện phương pháp hồi quy trong đó có những hạn chế tương tự như giải nén (bộ sưu tập tức là điểm 2d) nhưng tôi không biết làm thế nào để đảm bảo rằng phương pháp (implicit asPair: A => (A1, A2) exsist và ở đâu là nơi tốt nhất để xác định các chuyển đổi như vậy.

+4

Bạn có thể tìm thấy [loại tổng quát chế] (http: // stackoverflow .com/questions/3427345/what-do-and-mean-in-scala-2-8-and-where-are-them-documented) hữu ích. –

Trả lời

10

Đây là những gì TraversableOnce.toMap thực hiện để đảm bảo nó chỉ được gọi trên một tập hợp các cặp.

def toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U] = { 
    val b = immutable.Map.newBuilder[T, U] 
    for (x <- self) 
    b += x 
    b.result 
} 

Nhưng nếu bạn đang tìm kiếm để thêm một phương pháp tương tự như một lớp bộ sưu tập hiện tại, bạn có thể làm cho nó thậm chí còn dễ dàng hơn:

class EnhancedIterable[T,U](x: Iterable[(T,U)]) { // CanBuildFrom omitted for brevity 
    def swapAll() = x.map(_.swap) 
} 
implicit def enhanceIterable[T,U](x: Iterable[(T,U)]) = new EnhancedIterable(x) 

List((1,2), (3,4), (5,6)).swapAll // List((2,1), (4,3), (6,5)) 
List(1, 2, 3).swapAll // error: value swapAll is not a member of List[Int] 
Các vấn đề liên quan