Ví dụ trước đây, T m 0, là ví dụ về "ký pháp toán tử". Scala có ba loại ký hiệu toán tử, tiền tố (được gọi là unary), infix và postfix. Hãy xem ví dụ về cả ba trong hành động ở đây:
class MyByte(val n : Int) {
require(n >= 0 && n <= 255)
def unary_! = new MyByte(n^0xff)
def +(m : MyByte) = new MyByte(n + m.n)
def bits = (math.log(n)/math.log(2) + 1).toInt
override def toString = "0" * (8 - bits) + n.toBinaryString
}
Một ở đây nó đang được sử dụng:
scala> val a = new MyByte(5)
a: MyByte = 00000101
scala> val b = new MyByte(10)
b: MyByte = 00001010
scala> ! a // Prefix/Unary
res58: MyByte = 11111010
scala> a + b // Infix
res59: MyByte = 00001111
scala> b bits // Postfix
res60: Int = 4
Trong khi ghi vào và postfix ký hiệu chấp nhận bất kỳ định danh Scala hợp lệ, mặc dù có những lời nói về hạn chế ký hiệu postfix , chỉ có bốn số nhận dạng có thể được sử dụng làm tiền tố: ~,!, - và +.
Bây giờ, khi bạn thử "m 0", Scala loại bỏ nó là một toán tử đơn nhất, với lý do không phải là giá trị hợp lệ (~,!, - và +). Nó thấy rằng "m" là một đối tượng hợp lệ - nó là một hàm, không phải là một phương thức và tất cả các hàm đều là các đối tượng.
Vì "0" không phải là một số nhận dạng Scala hợp lệ, nó không thể không phải là một infix cũng không phải là một toán tử postfix. Do đó, Scala phàn nàn rằng nó mong đợi ";" - sẽ tách hai (gần như) các biểu thức hợp lệ: "m" và "0". Nếu bạn chèn nó vào, thì nó sẽ phàn nàn rằng m yêu cầu hoặc là một đối số, hoặc, thất bại, "_" để biến nó thành một hàm được áp dụng một phần.
Nguồn
2009-06-18 20:19:31
Không liệt kê sử dụng ::: và :: làm ký hiệu tiền tố? – andychase
@ asperous.us Không. Các toán tử kết thúc bằng ':' có một [fixity] khác nhau (http://en.wikipedia.org/wiki/Operator_associativity): chúng là _right associative_ thay vì _left associative_, nhưng chúng là các toán tử infix tất cả như nhau. –