2011-02-16 13 views
7

Rõ ràng, bạn không thể gọi áp dụng với một constructor kỷ lục:Nhà xây dựng bản ghi Clojure không phải là lớp học đầu tiên?

(defrecord Foo. [id field]) 

(apply Foo. my-list) 

thất bại lúc đọc vì nó không được mong đợi Foo. ở nơi đó.

Các chỉ workaround rõ ràng tôi có thể nghĩ là để thêm một chức năng nhà máy:

(make-foo [id field] (Foo. id field)) 

có thể được apply'ed tất nhiên.

Tôi có thiếu gì không? Tôi mong đợi điều này từ C#/Java nhưng chỉ nghĩ rằng đó là một chút thất vọng trong Clojure ...

+0

đồng ý đó là một chút của một kỳ quặc, nhưng cá nhân nó không bao giờ là một vấn đề như tôi tìm thấy các chức năng máy khá hữu ích - mô hình này hỗ trợ việc sử dụng Clojure thành ngữ hơn, mang lại cho bạn sự linh hoạt hơn trong các tham số tiền xử lý, cho phép các bộ tạo khác nhau cho các mục đích khác nhau, cung cấp một lớp trừu tượng, vv – mikera

Trả lời

10

Làm tròn lại bài đăng này-1.3 ....

Trong Clojure 1.3, defrecord tạo hai hàm tạo hàm tạo. Đưa ra:

(defrecord Person [first last]) 

này sẽ tạo ra một chức năng vị trí constructor ->Person:

(->Person "alex" "miller") 

và một hàm constructor đồ map->Person:

(map->Person {:first "string"}) 

Bởi vì đây là một bản đồ, tất cả các phím là không bắt buộc và đưa vào một giá trị nil trong đối tượng được xây dựng.

Bạn nên yêu cầu/sử dụng các hàm này từ ns nơi bạn khai báo bản ghi, nhưng bạn không cần phải nhập lớp bản ghi như khi bạn sử dụng hàm tạo lớp Java.

Thông tin chi tiết:

+0

Cảm ơn bạn đã cập nhật! –

3

Vấn đề được biết và có rất nhiều thảo luận về nó trong danh sách gửi thư Clojure. Hỗ trợ nhiều hơn có thể sẽ được thêm vào trong các phiên bản Clojure trong tương lai.

Đối với bây giờ bạn phải sử dụng chức năng của riêng bạn hoặc sử dụng https://github.com/david-mcneil/defrecord2 mà hỗ trợ một số tính năng như:

  • in trong một hình thức eval'able
  • cung cấp chức năng clojure như constructor
  • chấp nhận tên tham số (bản đồ) trong hàm dựng
  • tham gia trước/sau khi đi bộ đa phương thức
6

Foo. là một hàm tạo lớp Java, do đó nó có các ràng buộc interop Java điển hình với cách bạn gọi nó. Tạo hàm dựng là một giải pháp phổ biến (nó cũng có nghĩa là bạn không phải nhập Foo khi ở một không gian tên khác).

+0

Đó là một lớp ctor Java ld là chi tiết triển khai? Tôi đã xem đây là sự phá hỏng "mới" với các đặc tính hiệu năng tốt hơn. –

+0

Tôi ước nó chỉ là một chi tiết thực hiện nhưng đó chưa phải là trường hợp. –

+0

Xem câu trả lời khác của tôi cho bài đăng 1.3. Bản chất của lớp Java phần lớn có thể bị bỏ qua ngay bây giờ. –