2010-09-10 29 views

Trả lời

31

Về câu hỏi đầu tiên của bạn, bạn chỉ có thể sử dụng một loại bí danh:

type KeyValue = (Int, String) 

Và, tất nhiên, Scala là một hướng đối tượng ngôn ngữ, do liên quan đến thứ hai của bạn về làm thế nào để chuyên một tuple, từ kỳ diệu là thừa kế:

case class KeyValue(key: Int, value: String) extends (Int, String)(key, value) 

vậy là xong. Lớp học thậm chí không cần một cơ thể.

val kvp = KeyValue(42, "Hello") 
kvp._1 // => res0: Int = 42 
kvp.value // => res1: String = "Hello" 

Lưu ý, tuy nhiên, kế thừa từ trường hợp lớp (mà Tuple2 là), bị phản đối và có thể không được công nhận trong tương lai. Dưới đây là cảnh báo trình biên dịch bạn nhận được cho định nghĩa lớp ở trên:

cảnh báo: trường hợp lớp class KV có tổ tiên lớp trường hợp class Tuple2. Điều này đã không được chấp nhận vì làm phức tạp quá mức cả việc sử dụng và triển khai. Thay vào đó, bạn nên sử dụng các trình giải nén để khớp mẫu trên các nút không phải lá.

18

Bí danh loại là tốt để đặt tên cho Tuple của bạn, nhưng thay vào đó hãy thử sử dụng lớp chữ hoa. Bạn sẽ có thể sử dụng tên thông số

Ví dụ với tuple:

def foo(a : Int) : (Int, String) = { 
    (a,"bar") 
} 
val res = foo(1) 
val size = res._1 
val name= res._2 

Với một lớp trường hợp:

case class Result(size : Int , name : String) 
def foo(a : Int) : Result = { 
    Result(a,"bar") 
} 
val res = foo(1) 
val size = res.size 
val name= res.name 
+0

Đừng tuples làm việc nhanh hơn so với trường hợp các lớp học? Nhiệm vụ là việc xử lý phức tạp một lượng lớn dữ liệu đơn giản, một loại số-crunching. – Ivan

+6

@Ivan: Tuples * là * lớp chữ thường, đúng không? –

+4

Tuples thực sự là trường hợp lớp học! –

4

Dưới đây là một giải pháp mà tạo ra một bí danh loại và một đối tượng nhà máy.

scala> type T = (Int, String)       
defined type alias T 

scala> object T { def apply(i: Int, s: String): T = (i, s) } 
defined module T 

scala> new T(1, "a") 
res0: (Int, String) = (1,a) 

scala> T(1, "a") 
res1: (Int, String) = (1,a) 

Tuy nhiên như những người khác đã đề cập, bạn có thể chỉ cần tạo một lớp chữ hoa chữ thường.

0

Mặc dù những người khác đã nói, các lớp rõ ràng (trường hợp) là tốt nhất theo nghĩa chung.

Tuy nhiên đối với các tình huống cục bộ những gì bạn có thể làm là sử dụng tuple extractor để cải thiện mã dễ đọc:

val (first, second) = incrementPair(3, 4) 
println(s"$first ... $second") 

Cho một phương pháp trả lại một tuple:

def incrementPair(pair: (Int, Int)) : (Int, Int) = { 
    val (first, second) = pair 
    (first + 1, second + 1) 
} 
Các vấn đề liên quan