使用clojure.string时,我收到以下警告
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
我的clojure脚本是:
(ns play-with-it
(:use [clojure.string]))
有没有办法解决这些警告?
答案 0 :(得分:15)
是的,切换到
(ns play-with-it
(:require [clojure.string :as string]))
然后说例如。
(string/replace ...)
致电clojure.string
的{{1}}功能。
使用replace
,您可以将:use
中的所有Vars直接引入您的命名空间,并且由于其中一些Vars的名称与clojure.string
中的Vars冲突,您会收到警告。然后你必须说clojure.core
才能得到通常简称为clojure.core/replace
的内容。
名称的冲突是设计的; replace
的意思是clojure.string
d,其别名是这样的。 require
和str
是最常选择的别名。
答案 1 :(得分:7)
除了Michał的回答,您还可以从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
答案 2 :(得分:4)
除了Alex的回答,您还可以仅引用您想要的特定名称空间的变量。
(ns foo.core
(:use [clojure.string :only (replace-first)]))
由于replace-first
不在clojure.core
,因此不会发出警告。但是,如果您执行以下操作,仍会收到警告:
(ns foo.core
(:use [clojure.string :only (replace)]))
一般来说,人们似乎倾向于(ns foo.bar (:require [foo.bar :as baz]))
。
答案 3 :(得分:1)
从Clojure 1.4开始,您可以使用:require
:refer
从命名空间中引用您需要的各个函数:
(ns play-with-it
(:require [clojure.string :refer [replace-first]]))
现在推荐使用:use
。
假设您不需要clojure.string/replace
或clojure.string/reverse
,那么也会删除警告。
有关详细信息,请参阅this SO question和this JIRA issue。