2010-07-27 3 views
9

tôi có thể làm một cái gì đó giống nhưScala nhiều nhiệm vụ để biến hiện

def f(): Tuple2[String, Long] = ... 
val (a, b) = f() 

gì về nếu các biến được đã tồn tại? Tôi đang chạy cùng một bộ dữ liệu trên các bộ lọc và tôi không muốn chuỗi chúng (tên dài và như vậy). Đây là những gì tôi đã thử, nhưng nó phàn nàn về việc mong đợi; thay vì = trên dòng cuối cùng:

var a = ...initialization for this data 
var b = ...some other init 
(a, b) = g(a, b) // error: expected ';' but found '=' 

Có cách nào để tránh một bộ trung gian không?

+0

Tôi không có một nguồn tiện dụng, nhưng tôi nhớ đọc ở đâu đó rằng nhiều var phân công như thế là một ý tưởng tồi và không được hỗ trợ trong scala. Đây là một vài tháng trở lại (và những người hiểu biết khi bản gốc được viết), nhưng sự hiểu biết của tôi là bạn cần một trung gian. – Mike

+0

có thể trùng lặp của [Scala Tuple Deconstruction] (http://stackoverflow.com/questions/2776651/scala-tuple-deconstruction) –

Trả lời

8

Câu trả lời ngắn: Số

1

Nó hoạt động cho các giá trị mới vì cú pháp đó được coi là khớp mẫu, giống như báo cáo trường hợp. Vì vậy, như Alex cho biết, bạn không thể làm điều đó.

14

Như Alex đã chỉ ra, câu trả lời ngắn gọn là không. Điều xảy ra với mã của bạn là: khi ab là các biến đã bị ràng buộc trong phạm vi hiện tại, (a, b) có nghĩa là "lấy các giá trị của a và b và tạo một bộ từ chúng."

Do đó,

(a, b) = ... 

tương đương với

(new Tuple2(a, b)) = ... 

mà rõ ràng là không phải những gì bạn muốn (ngoài việc là vô nghĩa).

Cú pháp bạn muốn (khả năng gán cho nhiều biến cùng một lúc) chỉ đơn giản là không tồn tại. Bạn thậm chí không thể gán cùng một giá trị cho nhiều biến từ trước cùng một lúc (cú pháp thông thường "a = b = ..." được tìm thấy bằng nhiều ngôn ngữ khác không hoạt động trong Scala.) Tôi không nghĩ rằng một tai nạn mà vals được ưu đãi hơn vars; chúng hầu như luôn là một ý tưởng tốt hơn.

Có vẻ như tất cả điều này đang diễn ra bên trong vòng lặp của một số loại và thực hiện các bài tập lặp lại. Đây không phải là Scala thành ngữ. Tôi khuyên bạn nên cố gắng loại bỏ việc sử dụng các vars trong chương trình của bạn và thực hiện các công việc theo cách chức năng hơn, sử dụng bản đồ, sơ đồ phẳng, bộ lọc, foldLeft, v.v.

+0

Cú pháp Scala cho phép gán nhiều biến là 'var a, b, c = 0' Nó sử dụng dấu phẩy, chứ không phải dấu bằng. –

+2

Đọc những gì tôi đã nói một lần nữa. Tôi đã nói về việc gán cho nhiều biến * tồn tại trước trong một câu lệnh, không khai báo các biến mới với các giá trị ban đầu.Trước đây là những gì OP đang tìm kiếm, và những gì không được hỗ trợ bởi Scala (theo kiến ​​thức của tôi). –

0

Nếu bạn chạy luôn "cùng một bộ dữ liệu "over filters etc, nó là một triệu chứng mà chúng thuộc về nhau bằng cách nào đó, vì vậy bạn nên xem xét để nhóm chúng bằng cách sử dụng một tuple hoặc một lớp chuyên dụng (thường là một trường hợp lớp trong trường hợp này).

0

Cách giải quyết tôi thấy là thế này:

// declare as var, not val 
var x = (1,"hello") 
// x: (Int, String) = (1,hello) 

// to access first element 
x._1 
// res0: Int = 1 

// second element 
x._2 
// res1: String = hello 

// now I can re-assign x to something else 
x = (2, "world") 
// x: (Int, String) = (2,world) 

// I can only re-assign into x as long the types match 
// the following will fail 

x = (3.14, "Hmm Pie") 
<console>:8: error: type mismatch; 
found : Double(3.14) 
required: Int 
     x = (3.14, "Hmm Pie")