2013-06-02 32 views
6

On "Lập trình Clojure", có một ví dụ sử dụng get chức năng trên một vector:trong Clojure, là một vector một hashmap cụ thể?

(get [:a :b :c] 1) 
-> :b 

tôi gọi (doc get) và có vẻ như có được một hàm lấy hashmap như là đối số nhưng không vector, vì vậy tôi đi lang thang nếu vector là một loại hashmap. Tôi nhớ một hashmap có thể mất một số nguyên chỉ số, và trả lại giá trị phù hợp với chỉ số đó, vì vậy tôi đã này để xem nếu vector có thể làm điều tương tự:

([1 2 3 4] 1) 
-> 2 

Nó đã làm giá trị trả về 2, mà là ở chỉ số 1 trong [ 1 2 3 4].

Điều này có nghĩa là vectơ là băm không, cặp khóa-giá trị của nó là cặp giá trị chỉ mục?

+0

nói toán học, một vectơ là một * bản đồ * - một hàm (một hàm toán học). Tôi không biết làm thế nào nó được thực hiện trong clojure cụ thể, nhưng tôi nghi ngờ nó được thực hiện bằng cách sử dụng một băm. clojure được nhập động, do đó, nó không quan tâm loại thực tế là gì. – Elazar

Trả lời

8

Không, triển khai cơ bản khác.

đó đang được nói, vì logic vector làm chỉ số bản đồ đến các yếu tố, họ là những cấu trúc kết hợp trong Clojure và có thể được sử dụng với get, contains?assoc (mặc dù cho assoc chỉ chỉ số 0-1 trước khi kết thúc vector có thể được dùng). Tuy nhiên, chúng không thể được sử dụng với dissoc - đó là thao tác "bản đồ thực".

Ngoài ra, vectơ theo một cách khác để bản đồ khi được sử dụng như các chức năng: gọi một bản đồ như một chức năng tương đương với sử dụng nó với get, trong khi kêu gọi một vector tương đương với sử dụng nth. Sự khác biệt là nth ném ngoại lệ vào chỉ mục ngoài giới hạn (cũng như đối số không thể là chỉ mục, chẳng hạn như số âm hoặc số không), trong khi get trả về nil.

+0

Cảm ơn bạn, rất hữu ích! –

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