2013-03-05 20 views
6

Có thể ai đó giải thích cho tôi lỗi này:Không thể gõ gợi ý một địa phương với một initializer nguyên thủy

user> (let [^int i 3] i) 
CompilerException java.lang.UnsupportedOperationException: Can't type hint a local with a primitive initializer, compiling:(NO_SOURCE_PATH:1) 

Tôi không hiểu,

  • chính xác những gì tôi không thể gõ-gợi ý và lý do tại sao ?

  • lý do tại sao tôi có thể sử dụng gợi ý loại mảng trong cùng một tình huống?

    user> (let [^ints ii (int-array 1)] ii) 
    #<int[] [[email protected]> 
    
  • cách nhập gợi ý biến số nguyên cục bộ?

+0

Xem http://clojure.org/java_interop#Java%20Interop-Some%20optimization%20tips: "(cho phép [foo (int bar)] ...) là cách chính xác để có được một địa phương nguyên thủy. sử dụng^Số nguyên v.v ... " –

+0

Có lẽ vì trình biên dịch đã biết đủ để xác định loại 'i' ở đây. – Alex

+0

@ A.Webb Cảm ơn. Nó có thể giải quyết vấn đề thực tế của tôi. Tôi sẽ giữ cho câu hỏi mở một lúc. Hy vọng rằng, ai đó có thể giải thích lý do cho giới hạn này. – sastanin

Trả lời

4

Trường hợp ngoại lệ này được trình biên dịch gửi từ dòng this. Về cơ bản, nếu bạn sử dụng biểu thức là hằng số nguyên thủy hoặc thứ gì đó có thể được đánh giá tại thời gian biên dịch là hằng số nguyên thủy, như: (+ 1 10), trình biên dịch có thể phát hiện loại đối tượng và không cần loại gợi ý. Kiểm tra các phương thức getJavaClasshasJavaClass trong cùng một lớp mà liên kết trước đó trỏ đến. Các phương thức này kiểm tra nếu biểu thức là nguyên thủy, sau đó lấy lớp từ biểu thức chính nó, nếu không hãy sử dụng loại gợi ý nếu được cung cấp.

+0

Điều này thực sự thú vị khi nghe, nhưng toàn bộ các phần của CH 15.1-3 trong Joy of Clojure (ấn bản thứ hai, vừa xuất hiện cách đây vài tuần) đầy rẫy những ví dụ ngược lại. Tất nhiên, các ví dụ của họ cũng lộn xộn trong repl của tôi, nhưng tôi tò mò là tại sao họ đề nghị bạn làm điều này để tối ưu hóa. Có cách nào để tối ưu hóa bằng cách tắt công cụ kiểm tra kiểu hay đây là một công việc chỉnh sửa lộn xộn và chúng thực sự đang sử dụng phiên bản cũ hơn của Clojure trong đó cho phép loại gợi ý đó? – kurofune

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