2012-02-16 27 views
8

Khi sử dụng clojure.string, tôi nhận được những lời cảnh báo sausử dụng clojure.string gây cảnh báo

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 

kịch bản clojure của tôi là:

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

Có cách nào để sửa chữa những cảnh báo?

Trả lời

15

Có, chuyển sang

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

và sau đó nói ví dụ

(string/replace ...) 

để gọi clojure.string 's replace chức năng.

Với :use, bạn mang tất cả các Vars từ clojure.string trực tiếp vào không gian tên của bạn và vì một số trong số đó có tên xung đột với Vars trong clojure.core, bạn sẽ nhận được cảnh báo. Sau đó, bạn phải nói clojure.core/replace để xem nội dung thường được gọi là replace.

Cuộc xung đột tên được thiết kế; clojure.string có nghĩa là require d với bí danh như thế này. strstring là các bí danh được chọn thường xuyên nhất.

+0

Cảm ơn. Có thể undestand rằng từ doc của 'use'?" Giống như 'require', nhưng cũng đề cập đến không gian tên của mỗi lib bằng cách sử dụng' clojure.core/refer' "Những gì họ có ý nghĩa của câu này? – viebel

+1

Nó có nghĩa là 'use' thực hiện chính xác những gì' require' làm và sau đó trên nó yêu cầu 'refer' tạo các ánh xạ trong không gian tên hiện tại cho các công cụ được export bởi namespace là' use'd. (Cái mà tôi gọi là * mang [ing] tất cả các Vars từ [không gian tên 'use'd] trực tiếp vào không gian tên của bạn * ở trên.) Cf. '(doc refer)'. –

+0

Niềm vui của Clojure giải thích những điều khá tốt quá. – Bill

7

Ngoài câu trả lời Michał, bạn có thể loại trừ vars từ 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

Ngoài câu trả lời của Alex bạn cũng có thể tham khảo chỉ vars bạn muốn từ một không gian tên nhất định.

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

này sẽ không ném một cảnh báo kể từ replace-first không có trong clojure.core. Tuy nhiên, bạn vẫn sẽ nhận được cảnh báo nếu bạn đã thực hiện các thao tác sau:

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

Nói chung có vẻ như mọi người đang hướng tới (ns foo.bar (:require [foo.bar :as baz])).

1

Kể từ Clojure 1,4 bạn có thể tham khảo các chức năng cá nhân mà bạn cần từ một không gian tên sử dụng :require với một :refer:

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

này bây giờ được khuyến khích hơn :use.

Giả sử bạn không cần clojure.string/replace hoặc clojure.string/reverse, điều đó cũng sẽ xóa cảnh báo.

Xem this SO questionthis JIRA issue để biết thêm chi tiết.

Các vấn đề liên quan