2010-06-17 21 views
5

tengo lo siguiente en un espacio de nombres shapes decir:métodos múltiples Definición de Clojure

(derive ::rect ::shape) 
(derive ::square ::rect) 

Ahora ejecutando el siguiente en el espacio de nombres: shapes

(isa? ::square ::shape) 

devuelve true. Pero cuando yo haga lo siguiente en un espacio de nombres en el que realmente implementar métodos múltiples para el dibujo,

(isa? ::square ::shape) 

se devuelve false. Así que, aunque tengo las funciones correctas de despacho multimétodo, recibo un error que dice "no se encontró función de despacho".

¿Echo de menos algo? Implementar todo tipo de formas en un espacio de nombre gigante me parece inútil.

Respuesta

3

Resulta que :: utiliza el espacio de nombres actual, por lo que para usar tipos de otros espacios de nombres debe usar nombres completos como: formas/cuadrado.

0

Tiene razón, en su auto-respuesta, que el operador :: localiza algo en el espacio de nombre actual.

Un punto interesante es que las palabras clave pueden ser espacios de nombres en cualquier espacio de nombres que desee, incluso uno que no esté declarado en ningún archivo. Entonces, si su árbol de espacio de nombres es complicado, y prefiere: geometría/cuadrado, geometría/círculo y similares, puede usar eso.

Además, no olvide que derive, underive (no use underive en este momento), isa? y todas las funciones relacionadas le permiten usar una jerarquía independiente si lo desea. Consulte When and how should independent hierarchies be used in clojure?

0

Puede usar :: también con alias de espacio de nombres.

(ns some.other.package 
    (:require [some.terr.ibly.long.package.name :as short])) 

Ahora: ::short/abc se referirá ser el mismo que :some.terr.ibly.long.package.name/abc

+0

no debería ser ': corto/abc'? – amalloy

+0

No. Pero tengo que escribir 12 caracteres más. – kotarak

Cuestiones relacionadas