2012-02-25 30 views
26

Điều gì làm ~ trong đoạn Scala này?Người điều hành dấu ngã ở Scala

Ví dụ:

scala> val apple = 1 
apple: Int = 1 

scala> ~apple 
res0: Int = -2 

đã sâu mà làm gì để táo của tôi?

+2

scaleX, như hoogle cho scala: http://scalex.org/?q=~ –

+0

@GeneT liên kết bị phá vỡ – sjking

Trả lời

46

Đầu tiên, một số lời khuyên meta. Bất cứ lúc nào bạn tự hỏi làm thế nào trình biên dịch mở rộng một số cú pháp đường, infers một loại, hoặc áp dụng một chuyển đổi tiềm ẩn, sử dụng scala -Xprint:typer -e <expr> để cho bạn thấy những gì đã xảy ra.

scala -Xprint:typer -e "val a = 2; ~a" 

... 
private[this] val a: Int = 2; 
private <stable> <accessor> def a: Int = $anon.this.a; 
$anon.this.a.unary_~ 

Được rồi, một tiền tố ~ được mở rộng đến một phương pháp gọi thường xuyên của unary_~.

Từ language specification:

6.12.1 Pre fi x Operations

Một pre fi x hoạt động op e bao gồm một pre fi x hành op, mà phải là một trong những ers fi identi +, -, ! hoặc ~. Biểu thức op e tương đương với ứng dụng phương pháp sau 01 x e.unary_op.

Toán tử trước x khác với ứng dụng chức năng bình thường trong biểu thức toán hạng của chúng không cần phải là nguyên tử. Ví dụ, chuỗi đầu vào -sin(x) được đọc là -(sin(x)), trong khi chức năng ứng dụng phủ nhận sin(x) sẽ được phân tích cú pháp khi ứng dụng của toán tử lỗi đối với toán hạng phủ nhận và (x).

Điều đó có nghĩa rằng các nhà khai thác tiền tố không bị giới hạn để xây dựng trong các loại, họ có thể được sử dụng trên các loại của riêng bạn (mặc dù nó không phải là một ý tưởng tốt để đi điên với sức mạnh này!)

scala> object foo { def unary_~ = "!!!" } 
defined module foo 

scala> ~foo 
res0: java.lang.String = !!! 

Vì vậy, câu hỏi của bạn là gì? Bạn có thể kiểm tra chỉ mục của ScalaDoc cho thư viện chuẩn cho methods starting with u. nightly ScalaDoc có một số tài liệu được thêm gần đây cho phương pháp này.

the bitwise negation of this value 
Example: 
~5 == -6 
// in binary: ~00000101 == 
//    11111010 
+0

Cảm ơn lời giải thích và tham khảo. – Jack

16

~ là toán tử bitwise không được áp dụng cho số nguyên. Cách dễ dàng nhất để xem trong hex:

scala> "%x".format(~0x7F) 
res0: String = ffffff80 
+2

1 để khẳng định đó là Bitwise không điều hành. Tôi đã không quan tâm đến việc in chuỗi nhị phân khi bạn trả lời. Xin lỗi tôi chỉ có thể chấp nhận một câu trả lời. – Jack

+2

"dễ nhất" có thể là chủ quan ... – FracturedRetina

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