2012-02-16 9 views
8

Podczas korzystania clojure.string, otrzymuję następujące ostrzeżeniaużyciu clojure.string powoduje ostrzeżeń

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 

mój skrypt Clojure jest:

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

Czy istnieje jakiś sposób, aby rozwiązać te ostrzeżenia?

Odpowiedz

15

Tak przełącznik do

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

i powiedzieć np

(string/replace ...) 

zadzwonić replace funkcję clojure.string „s.

Z :use, wprowadzą w całej Vars od clojure.string bezpośrednio do przestrzeni nazw, a ponieważ niektóre z nich mają nazwy zderzeniu z Vars w clojure.core, pojawi się ostrzeżenie. Następnie musisz powiedzieć clojure.core/replace, aby uzyskać to, co zwykle nazywa się po prostu replace.

Zderzenie nazw jest zgodne z projektem; clojure.string ma być require d z takim aliasem. str i string to najczęściej wybierane aliasy.

+0

Dzięki. Czy było możliwe, aby to nie było z dokumentu "use"? "Jak" require ", ale odnosi się również do przestrzeni nazw każdej biblioteki za pomocą' clojure.core/refer' "Co oznaczają one przez to zdanie? – viebel

+1

Oznacza to, że 'use' robi dokładnie to, co' require', a następnie prosi 'refer' o tworzenie odwzorowań w bieżącym obszarze nazw dla rzeczy wyeksportowanych przez przestrzeń nazw' use'd. (To, co nazwałem *, przyniosło [wszystkich] Vars z [przestrzeni nazw 'use'd] bezpośrednio do twojej przestrzeni nazw * powyżej.) Por. '(doc refer)'. –

+0

Joy of Clojure również to wyjaśnia. – Bill

7

Poza odpowiedzią Michała, można wykluczyć vars z 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

oprócz odpowiedzi Alexa można również odnosić tylko vars chcesz z danej przestrzeni nazw.

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

Nie byłoby rzucić ostrzeżenie od replace-first nie jest w clojure.core. Jednakże, nadal pojawia się ostrzeżenie, jeśli nie następuje:

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

W ogóle wydaje się, ludzie dążą ku (ns foo.bar (:require [foo.bar :as baz])).

1

Od Clojure 1.4 możesz odwołać poszczególne funkcje potrzebne od nazw używając :require z :refer:

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

ta jest obecnie zalecana przez :use.

Zakładając, że nie potrzebujesz clojure.string/replace lub clojure.string/reverse, spowoduje to również usunięcie ostrzeżeń.

Aby uzyskać więcej informacji, zobacz numery this SO question i this JIRA issue.

Powiązane problemy