使用clojure.string会导致警告

时间:2012-02-16 23:09:03

标签: clojure

使用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]))

有没有办法解决这些警告?

4 个答案:

答案 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,其别名是这样的。 requirestr是最常选择的别名。

答案 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/replaceclojure.string/reverse,那么也会删除警告。

有关详细信息,请参阅this SO questionthis JIRA issue