2011-08-22 28 views
12

Tôi đang cố gắng để làm một cái gì đó như sauTrong Scala, làm cách nào tôi có thể gán lại các giá trị tuple?

var tuple = (1, "test") 
tuple._2 = "new" 

Tuy nhiên điều này không biên dịch nó than phiền về val

+3

Tôi nhìn vào http://www.scala-lang.org/api/current/index.html#scala.Tuple3 và tôi vẫn không thể thấy tùy chọn sao chép – deltanovember

+4

Phương thức sao chép được tự động giới thiệu vì 'Tuple3' là một' trường hợp lớp'. – Nicolas

Trả lời

38

Bạn không thể gán giá trị tuple. Họ cố ý không thay đổi: một khi bạn đã tạo ra một bộ tuple, bạn có thể tự tin rằng nó sẽ không bao giờ thay đổi. Điều này rất hữu ích cho việc viết mã đúng!

Nhưng nếu bạn muốn có một bộ dữ liệu khác thì sao? Đó là nơi mà các phương pháp sao chép do thỏa thuận hợp:

val tuple = (1, "test") 
val another = tuple.copy(_2 = "new") 

hoặc nếu bạn thực sự muốn sử dụng một var để chứa các tuple:

var tuple = (1, "test") 
tuple = tuple.copy(_2 = "new") 

Ngoài ra, nếu bạn thực sự, thực sự muốn giá trị của bạn để thay đổi cá nhân, bạn có thể sử dụng một lớp trường hợp thay vì (có lẽ với một chuyển đổi ngầm, do đó bạn có thể nhận được một tuple khi bạn cần nó):

case class Doublet[A,B](var _1: A, var _2: B) {} 
implicit def doublet_to_tuple[A,B](db: Doublet[A,B]) = (db._1, db._2) 
val doublet = Doublet(1, "test") 
doublet._2 = "new" 
+0

Hi Rex, bạn đã đề cập đến một lúc trước khi bạn đang làm việc trên một thư viện với các kiểu 'Muple' và các bộ sưu tập có thể thay đổi khác. Thật tuyệt vời khi thấy nó trên Github! –

+0

@Kipton Barros - Vâng, phải không? Tôi ước tôi có thời gian để hoàn thành nó. Tôi chạy vào một loạt các lỗi chuyên môn hóa và sau đó hết thời gian để giải quyết chúng. –

0

bạn có thể bao bọc các thành phần (s), bạn cần phải sửa đổi trong một lớp học trường hợp với một var thành viên, như:

case class Ref[A](var value: A) 

var tuple = (Ref(1), "test") 
tuple._1.value = 2 
println(tuple._1.value) // -> 2 
+0

Sử dụng một 'trường hợp lớp' có vẻ như một chút quá mức cần thiết nếu tất cả những gì bạn muốn trong số đó là tránh' new Ref (1) '. – jwvh

Các vấn đề liên quan