использование clojure.string вызывает ПРЕДУПРЕЖДЕНИЯ - PullRequest
8 голосов
/ 17 февраля 2012

При использовании 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

Мой сценарий закрытия:

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

Есть ли способ исправить эти предупреждения?

Ответы [ 4 ]

15 голосов
/ 17 февраля 2012

Да, переключиться на

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

, а затем произнесите, например,

(string/replace ...)

для вызова функции clojure.string replace.

С помощью :use вы вводите все Vars из clojure.string непосредственно в ваше пространство имен, и поскольку некоторые из них имеют имена, конфликтующие с Vars в clojure.core, вы получаете предупреждение. Тогда вам нужно будет сказать clojure.core/replace, чтобы получить то, что обычно называется replace.

Столкновение имен происходит по замыслу; clojure.string подразумевается как require d с таким псевдонимом. str и string являются наиболее часто используемыми псевдонимами.

7 голосов
/ 17 февраля 2012

Кроме ответа Михала, вы можете исключить переменные из 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 голосов
/ 20 февраля 2012

В дополнение к ответу Алекса вы также можете ссылаться только на те переменные, которые вам нужны, из заданного пространства имен.

(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])).

1 голос
/ 18 декабря 2013

Начиная с Clojure 1.4, вы можете ссылаться на нужные вам функции из пространства имен, используя :require с :refer:

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

Теперь рекомендуется более :use.

Если вам не нужны clojure.string/replace или clojure.string/reverse, это также уберет предупреждения.

См. этот вопрос SO и этот выпуск JIRA для получения более подробной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...