2010-09-10 9 views
5
(deftype Bag [state] 
    Object 
    (toString [bag] 
     (str "Bag???" state))) 

Tôi muốn các toString để trông giống nhưgì một phương thức toString tốt cho một đối tượng deftype'd trong clojure

clojure.core=> (def b (Bag. {:apples 1 :bannanas 4})) 
#'clojure.core/b 
clojure.core=> (str b) 
"BAG: {:apples 1 :bannanas 4}" 

một clojurey cách tốt đẹp của đại diện cho thông tin đó là gì? Là

"Bag/{:k :v}" 

tốt hơn? Cộng đồng bạn gọi toStrings của bạn như thế nào?

Trả lời

5

Dưới đây là dành cho deftype.

user=> (deftype Bag [state] 
     Object 
     (toString [_] 
      (str "BAG: " (pr-str state)))) 
user.Bag 
user=> (def b (Bag. {:apples 1 :bannanas 4})) 
#'user/b 
user=> (str b) 
"BAG: {:bannanas 4, :apples 1}" 
6

Tùy thuộc vào chính xác những gì bạn đang cố gắng để làm, cách đơn giản nhất là sử dụng defrecord:

 
user=> (defrecord Bag [state]) 
user.Bag 
user=> (def b (Bag. :foo)) 
#'user/b 
user=> b 
#:user.Bag{:state :foo} 

Mặc dù những gì bạn thấy ở trên là từ pr, không str:

 
user=> (str b) 
"[email protected]" 
user=> (prn b) 
#:user.Bag{:state :foo} 
nil 

Vì vậy, chúng tôi chỉ thực hiện thay đổi:

 
user=> (defrecord Bag [state] 
     Object 
     (toString [bag] (pr-str bag))) 
user.Bag 
user=> (def b (Bag. :foo)) 
#'user/b 
user=> (str b) 
"#:user.Bag{:state :foo}" 
user=> (.toString b) 
"#:user.Bag{:state :foo}" 

Bây giờ, nếu phần trên không phù hợp, thì tùy chọn tiếp theo sẽ là thêm phương thức mới vào phương thức đa phương tiện print-method. Google xung quanh để biết chi tiết về điều đó.

Ngoài ra: Sử dụng defrecord thường được ưu tiên hơn deftype trừ khi bạn đang làm điều gì đó rất thấp.

+0

Xác định mức độ thấp. Tôi đang cố gắng tạo các loại bộ sưu tập mới (túi và đa giác). Khi nào bạn sử dụng defrecord hoặc deftype và tại sao? –

+0

Sử dụng phương pháp này với deftype mang lại một java.lang.StackOverflowError –

+0

Có, nếu bạn đang tạo kiểu bộ sưu tập mới, deftype có lẽ là đúng, trong khi defrecord là thích hợp hơn khi cần một cái gì đó giống như cấu trúc của một số dữ liệu miền. –