Câu trả lời của Daniel tóm tắt đúng cách để làm điều này, cũng như tại sao nó hoạt động. Vì anh ta đã bao quát góc đó, tôi sẽ cố trả lời câu hỏi rộng hơn của bạn (liên quan đến thiết kế ngôn ngữ) ...
Bất cứ nơi nào có thể, Scala cố gắng tránh thêm các tính năng ngôn ngữ để xử lý mọi thứ thông qua các cơ chế hiện có. Ví dụ: Scala không bao gồm tuyên bố break
. Tuy nhiên, nó gần như không đáng kể để cuộn một trong những của riêng bạn như một thư viện:
case object BreakException extends RuntimeException
def break = throw BreakException
def breakable(body: =>Unit) = try {
body
} catch {
case BreakException =>()
}
Điều này có thể được sử dụng theo cách sau:
breakable {
while (true) {
if (atTheEnd) {
break
}
// do something normally
}
}
(lưu ý: này được bao gồm trong thư viện chuẩn cho Scala 2.8)
Nhiều cú pháp chuyển nhượng như được phép theo các ngôn ngữ như Ruby (ví dụ: x = 1, y = 2, z = 3
) rơi vào danh mục "cú pháp dự phòng". Khi Scala đã có một tính năng cho phép một mẫu cụ thể, nó tránh thêm một tính năng mới chỉ để xử lý một trường hợp đặc biệt của mẫu đó. Trong trường hợp này, Scala đã có kết hợp mẫu (một tính năng chung) có thể được sử dụng để xử lý nhiều phép gán (bằng cách sử dụng thủ thuật tuple được nêu trong các câu trả lời khác). Không cần thiết phải xử lý trường hợp đặc biệt đó theo cách riêng biệt.
Ngoài một chút khác biệt, cần lưu ý rằng cú pháp gán nhiều C (và do đó, Java) cũng là trường hợp đặc biệt của một tính năng tổng quát khác. Hãy xem xét:
int x = y = z = 1;
Điều này khai thác thực tế rằng nhiệm vụ trả về giá trị được chỉ định bằng ngôn ngữ phái sinh C (cũng như thực tế nhiệm vụ đó là đúng liên kết). Đây không phải là trường hợp trong Scala. Trong Scala, nhiệm vụ trả về Unit
. Trong khi điều này không có một số nhược điểm gây phiền nhiễu, nó là hợp lý về mặt lý thuyết vì nó nhấn mạnh tính chất tác dụng phụ của việc gán trực tiếp trong kiểu của nó.
Nguồn
2009-12-30 22:38:16
Điều đáng chú ý là 'val (a, b, c) = (1, 2, 3)' có vẻ là thành ngữ được chấp nhận chung cho nhiều bài tập, thích hợp hơn với các câu lệnh gán riêng biệt. Ít nhất, đó là ấn tượng của tôi đọc qua mã phát triển cộng đồng. –
Cũng đáng chú ý là bạn có thể đặt nhiều vals cho cùng một giá trị với "val x, y, z = 42" trực quan. –
Cũng có 'val seq @ Seq (a, b, c) = Seq (1,2,3)' không chỉ xác định các giá trị 'a',' b' và 'c', mà còn là' seqeunce 'seq '! – Mullefa