Tôi muốn gọi 'chứa' trên Iterables của tôi :-)Tại sao Iterator có phương thức chứa nhưng Iterable thì không, trong Scala 2.8?
Trả lời
lý do Iterable
không có một phương pháp contains
là bởi vì cách thức mà nó được định nghĩa có thể có những hậu quả trực tiếp trên vari ance. Về cơ bản, có hai chữ ký loại có ý nghĩa với nó:
def contains(v: Any): Boolean
def contains(v: A): Boolean
Định nghĩa thứ hai đã tăng độ an toàn kiểu. Tuy nhiên, A
, là tham số kiểu của bộ sưu tập, xuất hiện ở vị trí biến thể ngược, buộc tập hợp là bất biến. Nó thể được định nghĩa như thế này:
def contains[B >: A](v: B): Boolean
nhưng điều đó sẽ không cung cấp bất kỳ sự cải thiện so với chữ ký đầu tiên, sử dụng Any
.
Kết quả là, bạn sẽ thấy rằng immutable.Seq
là cùng biến thể và sử dụng chữ ký đầu tiên, trong khi immutable.Set
là bất biến và sử dụng chữ ký thứ hai.
Tôi không biết tại sao contains
không được định nghĩa trên Iterable
hoặc TraversableOnce
, nhưng bạn có thể dễ dàng xác định nó cho mình:
class TraversableWithContains[A](underlying: TraversableOnce[A]) {
def contains(v: Any): Boolean =
underlying.exists(_ == v)
}
implicit def addContains[A](i: Iterable[A]) = new TraversableWithContains(i)
và sử dụng nó như thể nó đã được xác định trên Iterable:
val iterable: Iterable[Int] = 1 to 4
assert(iterable.contains(3))
assert(!iterable.contains(5))
- 1. Porting mới Iterable {} mã từ Scala 2.7.7 đến 2.8
- 2. Tại sao không có giao diện "Iterable" trong STL?
- 3. lý do tại sao không có phương thức thêm trong giao diện Iterator
- 4. Trong scipy.stats rv_continuous có một phương thức phù hợp để tìm MLE, nhưng rv_discrete thì không. Tại sao?
- 5. Tại sao lambdas có thể chuyển đổi thành các biểu thức nhưng các nhóm phương pháp thì không?
- 6. Tại sao Bản đồ Scala được tự động nhập nhưng HashMap thì không?
- 7. Tại sao zipWithIndex được triển khai trong Iterable và không Traversable?
- 8. đối tượng str trong Python 2.7 không có __iter__, nhưng nó hoạt động như iterable. Tại sao?
- 9. đồ Scala trên iterator không tạo ra tác dụng phụ
- 10. Tại sao không phải là Enumerations Iterable?
- 11. Có vòng lặp do-until (postcondition) trong Scala 2.8 không?
- 12. Quan hệ giữa Iterable và Iterator là gì?
- 13. Tại sao stdint.h có thể được tìm thấy nhưng cstdint thì không?
- 14. trong perl (v5.14.2), tại sao bản đồ {+0,0}() chính xác nhưng bản đồ {0,0}() thì không?
- 15. tại sao đặt ẩn của MBProgressHUD thành CÓ, nhưng phương thức isHidden là KHÔNG?
- 16. Tại sao tôi không thể chỉnh sửa phương thức chứa phương thức ẩn danh trong trình gỡ lỗi?
- 17. Scala: Nhóm Iterable thành Iterable Iterables bởi một biến vị ngữ
- 18. scala: tại sao dấu gạch dưới (_) khởi tạo công việc cho các trường nhưng không phải là biến phương thức?
- 19. Tại sao Tùy chọn không mở rộng đặc điểm Iterable trực tiếp?
- 20. scala ngầm hoặc chuyển đổi rõ ràng từ iterator thành iterable
- 21. Tại sao có một trình lặp phương thức() trên java.util.Collection
- 22. Tại sao XElement không có phương thức GetAttributeValue?
- 23. Tại sao ObservableCollection không có phương thức RemoveAll?
- 24. Tại sao StringBuilder không có phương thức IndexOf?
- 25. Phương thức và phương thức Scala dưới dạng tham số
- 26. Tại sao NSArray không có phương thức firstObject?
- 27. Tại sao Bitmap gây ra quy tắc CA2000, nhưng Hình ảnh thì không?
- 28. Tại sao AlertDialog.Builder không có phương thức setOnDismissListener hoặc setOnShowListener?
- 29. Cách kiểm tra xem một mảng có chứa một giá trị cụ thể trong Scala 2.8 không?
- 30. Tại sao Danh sách Scala không có trường kích thước?
Lưu ý: 'contains' ** được thực hiện bằng chữ ký' chứa [A1>: A] (elem: A1) 'trong' SeqLike' (ít nhất là trong Scala 2.11.8). Tôi không nghĩ rằng điều này cũng giống như sử dụng 'Bất kỳ' - nó đặt một số ràng buộc vào kiểu' B' - bạn có thể chuyển 'Bất kỳ', nhưng bạn không thể chuyển một kiểu được biết là không liên quan. – Suma
@Suma Chắc chắn bạn có thể. Hãy tiếp tục và thử. Nếu bạn vượt qua một loại không liên quan, 'A1' sẽ được suy ra để trở thành siêu kiểu chung. Và bởi vì mọi thứ đều là hậu duệ của "Bất kỳ", sau đó tất cả các loại đều có một siêu kiểu chung với nhau. –
Bạn nói đúng. Có bất kỳ lý do nào tại sao chữ ký trong thư viện như vậy không, và không phải với chữ "Bất kỳ", khi bạn viết, vậy thì sao? – Suma