2013-02-10 59 views

Trả lời

10
(defn bytes? [x] 
    (if (nil? x) 
    false 
    (= (Class/forName "[B") 
     (.getClass x)))) 

Update. Câu hỏi tương tự đã được hỏi tại đây Testing whether an object is a Java primitive array in Clojure. Và google cung cấp cho chính xác trang đó về câu hỏi của bạn "làm thế nào để kiểm tra xem một đối tượng clojure là một mảng byte?" ;)

+1

phần Các 'forName' là rất không hiệu quả và thực hiện phụ thuộc. Câu trả lời của Nielsk nhanh hơn và mạnh mẽ hơn. – dimagog

+0

@dimagog là đúng. Thay vì chỉnh sửa mã tôi chỉ muốn lưu ý rằng '(Class/forName" [B ")' có thể được chuyển vào một var như '(def^{: private true} byte-class (Class/forName" [B ")) '. Đây là bạn phải trả chi phí hội nghị thay thế var thay vì chi phí phản ánh khi chạy. Tôi không biết cái nào tệ hơn. Ngoài ra AFAIK '^: const' không hoạt động trong trường hợp này. – muhuk

12

Cách tôi đã sử dụng để thực hiện việc này cho đến bây giờ là tạo một mảng kiểu đó và kiểm tra cho lớp đó. Để ngăn chặn việc tạo một cá thể không cần thiết mỗi lần, hãy tạo một hàm đóng trên lớp của kiểu mảng cụ thể đó.

(defn test-array 
    [t] 
    (let [check (type (t []))] 
    (fn [arg] (instance? check arg)))) 

(def byte-array? 
    (test-array byte-array)) 

=> (byte-array? (byte-array 8)) 
true 

=> (byte-array? [1 2 3]) 
false 

dụ Mobyte dường như đơn giản hơn rất nhiều mặc dù, và có vẻ như tôi sẽ có một số refactoring để làm nơi tôi sử dụng này :)

+2

Không có câu trả lời nào được quyền bỏ phiếu: mọi người thích những gì họ thích. Theo kinh nghiệm của tôi, phàn nàn về việc thiếu phiếu bầu đã khuyến khích họ nhiều hơn. – amalloy

+0

@NielsK Tôi đã upvoted câu trả lời của bạn. Không phải vì yêu cầu của bạn mặc dù, nhưng bởi vì nó tốt hơn :-). – dimagog

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