2013-07-31 24 views
7

Tôi đang xem mã nguồn của người khác (Scala), nơi tôi thấy toán tử :+= đang được gọi trên một biến loại IndexedSeq. Tôi đang tìm kiếm trên trang scaladocs cho lớp đó để tìm ra toán tử đó làm gì, nhưng tôi không thấy nó. Tôi nghĩ rằng một trong hai nó được định nghĩa trong một lớp bên ngoài của hệ thống phân cấp thừa kế của IndexedSeq, hoặc người nào khác javascript trên trang scaladocs đang ẩn nó ở đâu đó tôi không thể nhìn thấy nó. (Trên thực tế, không phải, xem câu trả lời bên dưới.)Làm cách nào tôi có thể tìm định nghĩa về các phương thức/hoạt động được xác định trong lớp được chuyển đổi ngầm?

Tôi đã nhấn từng nút trên trang scaladocs cố gắng hiện tất cả mọi thứ. Tôi đã xem mã HTML của trang web. Đã có một cách để tìm kiếm một toán tử từ tài liệu của một lớp mà nó có thể được áp dụng. Không có ở đó?

(NB:. Tôi nhìn lên rằng nhà điều hành sử dụng symbolhound, vì vậy tôi biết những gì nhà điều hành có nghĩa là bây giờ câu hỏi này là về tài liệu scala nói chung, không phải là nhà điều hành cụ thể.)

Trả lời

9

Tất cả các toán tử trong Scala là các phương pháp thông thường.

Bạn không thể tìm thấy nó vì nó là biên dịch ma thuật tái assignement, nó là không một nhà điều hành. Hoặc nói theo cách khác: nó trông giống như một nhà điều hành của riêng nó, nhưng nó thực sự là "một nhà điều hành theo sau là nhân vật =".

Trình biên dịch sẽ biến nó thành phép gán nếu toán tử (ở đây :+) trả về kiểu thích hợp và giá trị ban đầu là var.

Vì nó không được cung cấp bởi bất kỳ phương pháp ngầm hay phương thức rõ ràng nào trên Seq[T] hoặc bất kỳ thứ gì, nó không xuất hiện ở bất kỳ đâu trong scaladoc được tạo.

Vì vậy, để trả lời những câu hỏi chung:

  • Nó là một cấu trúc ngôn ngữ, vì vậy nơi duy nhất nó được ghi nhận là đặc điểm kỹ thuật, thật đáng buồn,
  • nhưng, nếu bạn tìm thấy một số "<?>=" điều hành chưa được biết ở đâu đó , hãy tìm định nghĩa của "<?>", cái đó chắc chắn sẽ được ghi lại.

Sửa: Cuối cùng tôi tìm thấy nơi này được định nghĩa trong SLS:

§6.12.4:

Một toán tử gán là một biểu tượng điều hành (cú pháp loại op trong 1.1)) mà kết thúc bằng một bằng nhân vật “=”, với ngoại lệ của nhà khai thác mà một trong những điều kiện sau đây giữ:

(1) các nhà điều hành cũng bắt đầu với một bằng nhân vật, hoặc

(2) toán tử là một trong số (< =), (> =), (! =).

Nó cũng nói sau này nó chỉ xảy ra khi tất cả các tùy chọn khác đã được thử (bao gồm cả tiềm năng implicits).

+0

Đó là một điều tốt. Không có gì về điều này trong chỉ mục của "Lập trình trong Scala" dưới '=' (cũng không, cho rằng vấn đề, "chuyển nhượng" cũng không "nhượng lại"). Cảm ơn bạn! –

+0

Nhưng hãy nói nếu tôi tạo lớp của riêng mình bằng phương thức '+' và thử ở trên. Nó hoạt động. Nhưng thay vì '+' nếu tôi thử nói tên khác của phương thức nói 'add', thì nó không hoạt động. 'class A (val n: Int) { def add (o: A) = new A (n + o.n) }' và thử làm 'var i = new A (1); i add = new A (2) '. Điều này không hoạt động. Thay thế 'add' bằng' + 'hoạt động như mong đợi. Thú vị, có bất kỳ điều nào được chỉ định trong tài liệu – Jatin

+0

@AdamMackler chỉ mục PiS dưới '+ =' chỉ định lại với các bộ và biến không thay đổi. Điểm đến http://www.artima.com/pins1ed/next-steps-in-scala.html#step10 nơi bạn không chỉ học những gì + = có nghĩa là, nhưng trong Scala bạn "trộn trong" đặc điểm. Quá nhiều để hấp thụ! –

1

là giá trị này được gán cho một biến số? Nếu đó là trường hợp tôi nghĩ đường cú pháp sau:

scala> var x = IndexedSeq(1,2,3) 
x: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> x :+= 10 

scala> x 
res59: IndexedSeq[Int] = Vector(1, 2, 3, 10) 

scala> val y = IndexedSeq(1,2,3) 
y: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> y :+= 10 
<console>:16: error: value :+= is not a member of IndexedSeq[Int] 
      y :+= 10 
      ^

Đó là đường cú pháp cho "vận hành và chuyển nhượng", như +=:

scala> var x = 10 
x: Int = 10 

scala> x += 1 

scala> x 
res63: Int = 11 

nào de-đường để x = x + 1.

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