2012-06-11 25 views
5

Với mã scala sau:Tại sao Scala xác định toán tử "+ =" cho các loại Ngắn và Byte?

var short: Short = 0 
short += 1  // error: type mismatch 
short += short // error: type mismatch 
short += 1.toByte // error: type mismatch 

Tôi không đặt câu hỏi về đánh máy cơ bản - thì rõ ràng rằng "giá trị + Ngắn == Int".

Câu hỏi của tôi là:
1. Có cách nào để người vận hành có thể sử dụng không?
2. Nếu không, thì tại sao toán tử có sẵn để sử dụng trên Short & Byte?

[Và bằng cách mở rộng * =, | = & =, vv]

+0

Thực ra, Short không có phương thức "+ =" hoặc "* =", bạn có thể tìm kiếm tài liệu cho Short http://www.scala-lang.org/api/current/index.html#scala. Ngắn . x someoperator = y đang dịch tự động x = x someoperator y. – Eastsun

+0

@Eastsun Nhưng không Int :-) 'a op = b' là cú pháp đường cho dạng mở rộng:' a = a op b', giải thích lỗi kiểu (Short + Short -> Int). Nó không giải thích tại sao quyết định được đưa ra hoặc những gì sử dụng cấu trúc này có thể - hoặc có thể không - có. (Trong C# nó là hoàn toàn hợp pháp để làm 'byte + = 1' nhưng không phải' byte = byte + 1', và hành vi là cụ thể trong tiêu chuẩn - có một diễn viên tiềm ẩn trở lại loại LHS trong C#). –

+0

@pst Có, bạn có thể làm điều tương tự trong Java như trong C# (Nếu tôi nhớ chính xác.) – Eastsun

Trả lời

1

Vấn đề dường như là "+ (ngắn)" trên lớp ngắn được định nghĩa là:

def +(x: Short): Int 

Vì vậy, nó luôn trả về một Int.

Với này bạn kết thúc không thể sử dụng + = "điều hành" vì các hoạt động + kết quả là một Int đó (rõ ràng) không thể được gán cho var "ngắn" trong phiên bản khử đường:

short = short + short 

đối với câu hỏi thứ hai của bạn, nó là "có sẵn" bởi vì khi trình biên dịch scala thấy biểu hiện như:

x K= y 

và nếu x là một var và K là bất kỳ nhà điều hành mang tính biểu tượng và có phương pháp K x sau đó trình biên dịch dịch hoặc "desugar" nó thành:

x = x K y 

Và sau đó cố gắng tiếp tục biên dịch với điều đó.

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