2010-06-10 33 views
10

Tôi đang cố gắng giải quyết một cảnh báo phản chiếu trong Clojure có vẻ là do thiếu suy luận kiểu về các giá trị trả về hàm là các đối tượng Java bình thường.Loại gợi ý cho các hàm trong Clojure

dụ Trivial mã đó chứng tỏ vấn đề:

(set! *warn-on-reflection* true)  

(defn foo [#^Integer x] (+ 3 x)) 

(.equals (foo 2) (foo 2)) 

=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved. 
    true 

cách tốt nhất để giải quyết việc này là gì? Điều này có thể được thực hiện với các gợi ý loại?

+0

Bạn đang sử dụng phiên bản Clojure nào? Tôi đã thử ví dụ của bạn trong Clojure v1.0 của tôi và có vẻ như nó hoạt động tốt ... – Greg

+0

Đó là một bản dựng hình lục giác 1,2. Lưu ý rằng cảnh báo chỉ hiển thị với (set! * Warn-on-reflection * true) có thể là sự khác biệt .... đã chỉnh sửa câu hỏi để làm rõ hơn – mikera

+0

Vâng, đúng vậy. Tôi thấy nó bây giờ. – Greg

Trả lời

11

Hai phiên bản xuất hiện để làm việc:

user> (defn foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved. ;' 
true 
user> (.equals ^Integer (foo 2) ^Integer (foo 2)) 
true 
user> (defn ^Integer foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
true 

Lưu ý rằng loại gián tiếp vẫn là một chút thay đổi liên tục trong Clojure ngay bây giờ dẫn đến việc phát hành 1,2, vì vậy điều này có thể không hoạt động theo cùng một cách vĩnh viễn. Cũng lưu ý rằng #^ không còn được dùng để ủng hộ ^.

+0

Tuyệt vời, hoạt động hoàn hảo nhờ! Cũng tốt để biết về cú pháp thay đổi ... những niềm vui của cuộc sống trên các cạnh cắt tôi đoán :-) – mikera

+0

đó là tuyệt vời! mong muốn tăng tốc độ mã của tôi bằng cách sử dụng này :) – jorgeu

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