2010-06-17 26 views
5

Tôi có sau đây trong một không gian tên nói shapes:Xác định Clojure multimethods

(derive ::rect ::shape) 
(derive ::square ::rect) 

Bây giờ thực hiện những điều sau đây trong không gian tên shapes:

(isa? ::square ::shape) 

lợi nhuận true. Nhưng khi tôi thực hiện những điều sau trong không gian tên nơi tôi thực sự triển khai đa phương thức để vẽ,

(isa? ::square ::shape) 

trả về false. Vì vậy, mặc dù tôi có các chức năng gửi đa phương thức chính xác tại chỗ tôi nhận được một lỗi có nội dung "không tìm thấy hàm công văn".

Tôi có thiếu gì đó không? Việc triển khai tất cả các loại hình dạng trong một không gian tên khổng lồ dường như vô nghĩa đối với tôi.

Trả lời

3

Tắt, :: sử dụng không gian tên hiện tại để sử dụng các loại từ các không gian tên khác mà bạn cần sử dụng các tên đủ điều kiện như: hình/hình vuông.

0

Bạn đúng, trong câu trả lời của bạn, rằng toán tử :: định vị một thứ gì đó trong không gian tên hiện tại.

Một điểm thú vị là các từ khóa có thể được đặt tên trong bất kỳ không gian tên nào bạn thích, thậm chí một từ không được khai báo trong bất kỳ tệp nào. Vì vậy, nếu cây không gian tên của bạn phức tạp và bạn thích: hình học/hình vuông,: hình học/hình tròn và các loại tương tự, bạn có thể sử dụng nó.

Ngoài ra, đừng quên rằng có nguồn gốc, thụ động (không sử dụng ngay bây giờ), isa? và các chức năng liên quan đều cho phép bạn sử dụng một hệ thống phân cấp độc lập nếu bạn muốn. Xem When and how should independent hierarchies be used in clojure?

0

Bạn cũng có thể sử dụng :: cũng với bí danh không gian tên.

(ns some.other.package 
    (:require [some.terr.ibly.long.package.name :as short])) 

Bây giờ là: ::short/abc sẽ giới thiệu được giống như :some.terr.ibly.long.package.name/abc

+0

nên không này được ': ngắn/abc'? – amalloy

+0

No. Nhưng tôi phải nhập thêm 12 ký tự. – kotarak

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