Đó là tất cả về các loại. Các hàm chuỗi hoạt động giống như chúng gọi seq
trên đối số của chúng và do đó không phải lúc nào cũng trả về cùng một loại đối tượng. Các hàm thu thập và các hàm kiểu cụ thể không gọi hàm seq và trả về một đối tượng có cùng kiểu như những gì đã được cung cấp cho chúng. Nó làm cho chúng trở nên ảo tưởng về việc trả lại cùng một đối tượng (điều này có thể là lý do cho hành vi này) ngay cả khi đó không phải là trường hợp. Chúng ta có thể nói rằng quy tắc của ngón tay cái là một chức năng bảo toàn meta khi nó bảo toàn loại.
user> (meta (seq (with-meta (list 1) {:a 1})))
{:a 1}
user> (meta (seq (with-meta (vector 1) {:a 1})))
nil
Hãy chắc chắn phải nhận thức được khi sự lười biếng có liên quan đến khó khăn:
user> (type (list 1))
clojure.lang.PersistentList
user> (type (map identity (list 1)))
clojure.lang.LazySeq
user> (meta (seq (with-meta (map identity (list 1)) {:a 1})))
nil
Đối với một danh sách các chức năng mà giữ gìn meta trên bộ sưu tập, hãy xem trang data structures. Những cái không được giữ lại dưới trang sequences, ngoại trừ khi chúng trả về một đối tượng cùng loại.
Dưới mui xe Tôi không hoàn toàn chắc chắn về các chi tiết kể từ sự lười biếng và chunked chuỗi đã được thêm vào, nhưng bạn có thể nhìn vào cons
, seq
và seqFrom
phương pháp từ lớp RT
. Các chức năng không bảo quản siêu dữ liệu đi qua các phương pháp này. Trong khi các hàm sưu tập kết thúc bằng cách sử dụng các phương thức cụ thể cho các loại của chúng.
Nguồn
2011-01-13 04:45:24