2012-02-16 12 views
8

Al utilizar clojure.string, recibo las siguientes advertenciasusando clojure.string hace que los mensajes de ADVERTENCIA

WARNING: replace already refers to: #'clojure.core/replace in namespace: tutorial.regexp, being replaced by: #'clojure.string/replace 
WARNING: reverse already refers to: #'clojure.core/reverse in namespace: tutorial.regexp, being replaced by: #'clojure.string/reverse 

mi guión clojure es:

(ns play-with-it 
    (:use [clojure.string])) 

¿Hay alguna manera de solucionar esas advertencias?

Respuesta

15

Sí, cambiar a

(ns play-with-it 
    (:require [clojure.string :as string])) 

y luego dicen, por ejemplo,

(string/replace ...) 

para llamar a la función replaceclojure.string 's.

Con :use, traéis toda Vars clojure.string directamente en el espacio de nombres, y puesto que algunos de los que tienen nombres chocar con Vars en clojure.core, se obtiene la advertencia. Entonces tendrías que decir clojure.core/replace para llegar a lo que normalmente se llama simplemente replace.

El choque de nombres es por diseño; clojure.string está destinado a ser require d con un alias como este. str y string son los alias más frecuentemente elegidos.

+0

Gracias. ¿Fue posible entender eso desde el documento de 'uso'? "Al igual que 'requiere', pero también se refiere al espacio de nombres de cada biblioteca usando' clojure.core/refer' "¿Qué quieren decir con esta frase? – viebel

+1

Significa que 'use' hace exactamente lo que' require' y luego agrega 'refer' para crear mapeos en el espacio de nombres actual para que las cosas exportadas por el espacio de nombres sean' use'd. (Lo que llamé * trayendo [ing] todos los Vars del [espacio de nombres 'use'd] directamente en su espacio de nombres * anterior.) Cf. '(doc refer)'. –

+0

Joy of Clojure explica esto bastante bien también. – Bill

7

Además de la respuesta de Michal, puede excluir VARs de clojure.core:

 
user=> (ns foo) 
nil 
foo=> (defn map []) 
WARNING: map already refers to: #'clojure.core/map in namespace: foo, being replaced by: #'foo/map 
#'foo/map 
foo=> (ns bar 
     (:refer-clojure :exclude [map])) 
nil 
bar=> (defn map []) 
#'bar/map 
4

Además de la respuesta de Alex también puede referirse sólo a los VARs que desee en un espacio de nombres dado.

(ns foo.core 
    (:use [clojure.string :only (replace-first)])) 

Esto no sería lanzar una advertencia ya no se encuentra en replace-firstclojure.core. Sin embargo, a pesar de ello recibirá una advertencia si se hizo lo siguiente:

(ns foo.core 
    (:use [clojure.string :only (replace)])) 

En general parece que la gente tienden hacia (ns foo.bar (:require [foo.bar :as baz])).

1

Desde Clojure 1.4 puede consultar las distintas funciones que necesita de un espacio de nombres utilizando :require con un :refer:

(ns play-with-it 
    (:require [clojure.string :refer [replace-first]])) 

Esto ahora se recomienda más de :use.

Suponiendo que no necesita clojure.string/replace o clojure.string/reverse, eso también eliminaría las advertencias.

Consulte this SO question y this JIRA issue para obtener más información.

Cuestiones relacionadas