2013-01-22 18 views
6

Tôi có một loạt các lớp Scala (như Lift's Box, Scala's Option, vv) mà tôi muốn sử dụng trong Clojure như là một Clojure ISeq.Clojure ISeq từ các lớp Scala

Làm cách nào để cho Clojure biết cách đặt các lớp này thành ISeq sao cho tất cả các chuỗi khác nhau các hàm liên quan "chỉ hoạt động"?

Trả lời

2

Để xây dựng dựa trên câu trả lời của Arthur, bạn có thể cung cấp một lớp wrapper chung trong Scala cùng những dòng này:

class WrapCollection(repr: TraversableOnce[_]) extends clojure.lang.Seqable { ... } 
2

Nếu các lớp thực hiện giao diện Iterable thì bạn có thể chỉ cần gọi seq trên chúng để có được sự bắt buộc. Hầu hết các chức năng trong thư viện trình tự sẽ làm điều này cho bạn mặc dù vậy trong hầu hết các trường hợp bình thường, bạn chỉ có thể chuyển chúng đến các hàm seq như firstcount.

+3

Phần đầu tiên của việc này là đúng sự thật và những lời khuyên tốt, nhưng bạn hoàn toàn không thể mở rộng Seqable một already- được định nghĩa lớp, vì nó là một giao diện, không phải là một giao thức. – amalloy

+0

Đây không phải là trường hợp duy nhất cho 'java.lang.Iterable'? Bộ sưu tập Scala (không nói một mình 'Tùy chọn' hoặc 'Hộp') không, thay vào đó trộn vào (hoặc được chuyển đổi hoàn toàn thành)' scala.collection.TraversableOnce', 'scala.collection.TraversableLike' và/hoặc các khoản phụ của chúng. –

+0

s/java.lang/java.util/trong nhận xét trước của tôi. :/ –

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