2011-08-24 9 views

Trả lời

9

Tất cả mutable bộ sưu tập trong Scala có BufferLike trait và nó định nghĩa một append phương pháp.

Immutable bộ sưu tập không có các đặc điểm BufferLike và do đó chỉ xác định các phương pháp khác mà không làm thay đổi bộ sưu tập tại chỗ nhưng tạo ra một cái mới.

+1

Vâng, nhưng tại sao? Tôi có thể sống với một Seq trả về một Seq mới sau khi 'nối thêm '. Tại sao không thêm các bí danh như vậy, ít nhất là cho khả năng tương tác java dễ dàng hơn. – F0RR

+4

Ngữ nghĩa học, nối thêm trong Java được sử dụng cho các lớp đệm khác nhau, như StringBuffer và StringBuilder, khi bạn sử dụng chắp thêm bạn mong đợi nó thêm vào đối tượng hiện tại, không tạo đối tượng mới. Bằng cách định nghĩa một phương thức chắp thêm để tạo ra một đối tượng mới, bạn phá vỡ kỳ vọng này, điều này hoàn toàn không tốt chút nào. –

3

Trong thực tế, họ thường là một số từ đồng nghĩa con người có thể đọc được:

  • foldLeft tương đương với /:
  • foldRight tương đương với :\

Những người còn lại là nhà khai thác bổ sung, đó là khá nhân có thể đọc được như sau:

    .210
  • ++ tương đương với java addAll
  • :+ là thêm
  • +: được thêm vào trước

Vị trí của dấu chấm phẩy chỉ ra trường hợp người nhận.

Cuối cùng, một số toán tử lạ là các di sản của các ngôn ngữ lập trình chức năng khác. Chẳng hạn như xây dựng danh sách (SML) hoặc nhắn tin diễn viên (erlang).

+0

Tôi không chắc chắn rằng ': +' và 'append' là giống nhau. Tôi nghĩ rằng các cựu (từ 'SeqLike') tạo ra một bộ sưu tập mới trong khi sau này (từ' BufferLike') sửa đổi bộ đệm tại chỗ. –

+0

Có, họ có ngữ nghĩa khác nhau trong Scala, nhưng nó vẫn là một "nối thêm" hoạt động. – paradigmatic

4

Tên phương pháp tượng trưng cho phép kết hợp với thao tác gán =.

Ví dụ, nếu bạn có một phương pháp ++ mà tạo ra một bộ sưu tập mới, bạn có thể tự động sử dụng ++= để gán bộ sưu tập mới cho một số biến:

var array = Array(1,2,3) 
array ++= Array(4,5,6) 
// array is now Array(1,2,3,4,5,6) 

Đây không phải là có thể mà không tên phương pháp mang tính biểu tượng.

0

Thư viện chuẩn Scala không được đặt là thân thiện với Java. Thay vào đó, các adapter được cung cấp để chuyển đổi giữa các bộ sưu tập Java và Scala.

Cố gắng cung cấp API thân thiện với Java sẽ không chỉ hạn chế lựa chọn số nhận dạng (hoặc ủy quyền cho bí danh nên được cung cấp), mà còn giới hạn cách sử dụng các loại generics và chức năng. Cần kiểm tra nhiều hơn đáng kể để xác thực thiết kế.

Cùng một chủ đề, tôi nhớ một số cuộc tranh luận về việc liệu 2.8 bộ sưu tập có nên thực hiện java.util.Iterable hay không.

http://scala-programming-language.1934581.n4.nabble.com/How-to-set-the-scale-for-scala-BigDecimal-s-method-td1948885.html

http://www.scala-lang.org/node/2177

2

Có bất kỳ khác biệt so với bất kỳ ngôn ngữ khác?

Hãy dùng Java. Phiên bản có thể đọc được của con người là gì +, -, */ trên int? Hoặc, hãy lấy String: phiên bản có thể đọc được của con người là + là gì? Lưu ý rằng concat không giống nhau - nó không chấp nhận các tham số không phải là String.

Có lẽ bạn đang làm phiền bởi vì trong Java - không giống như, nói, C++ - một trong hai thứ sử dụng các toán tử không phải chữ cái, hoặc các toán tử chữ cái - ngoại trừ '+.