2009-06-17 10 views
22

Trong Scala, tại sao tôi có thể bỏ qua dấu chấm và khung trong T m 0 (thay vì T.m(0)) trong phần sau?Tôi có thể bỏ qua những nhân vật nào trong Scala?

scala> object T { def m(i:Int) = 0 == i } 
defined module T 

scala> T m 0 
res19: Boolean = true 

Nhưng tại sao tôi không thể bỏ qua bộ đệm trong n(0) sau đây?

scala> def n(i:Int) = 0 == i 
n: (Int)Boolean 

scala> n 0 
<console>:1: error: ';' expected but integer literal found. 
     n 0 
     ^

Trả lời

36

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.

+0

Không liệt kê sử dụng ::: và :: làm ký hiệu tiền tố? – andychase

+1

@ 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. –

3

Tôi tin rằng kiểu cú pháp toán tử chỉ hoạt động khi bạn có đối tượng rõ ràng ở phía bên tay trái. Cú pháp được thiết kế để cho phép bạn thể hiện các thao tác kiểu "toán hạng toán tử" theo cách tự nhiên.

+1

Tôi không biết bạn có ý nghĩa gì bởi đối tượng rõ ràng, nhưng bạn có thể có khá nhiều thứ để đánh giá đối tượng ở bên trái, phải không? (... trái?) –