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

Quiero que el toString para mirar algo así como¿Qué es un buen método toString para un objeto deftype'd en clojure

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

¿Qué es una buena manera de representar clojurey esa información? ¿Es

"Bag/{:k :v}" 

mejor? ¿Cómo llama la comunidad a yourStrings?

Respuesta

5

El siguiente es para 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

Dependiendo de exactamente lo que estamos tratando de hacer, la manera más simple es utilizar defrecord:

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

A pesar de lo que se ve arriba es de pr, no str:

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

Así acabamos de hacer un cambio:

 
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}" 

Ahora, si lo anterior no es adecuado, la siguiente opción sería agregar un nuevo método al método múltiple print-method. Busca en Google detalles sobre eso.

Aparte: El uso de defrecord generalmente se debe preferir a deftype a menos que esté haciendo algo de muy bajo nivel.

+0

Define low level. Intento crear nuevos tipos de colecciones (bolsas y multimapas). ¿Cuándo utiliza defrecord o deftype y por qué? –

+0

El uso de este método con deftype produce un java.lang.StackOverflowError –

+0

Sí, si está creando un nuevo tipo de colección, deftype es probablemente correcto, mientras que defrecord es más apropiado cuando se necesita algo como una estructura de algunos datos de dominio. –

Cuestiones relacionadas