指令(:require)用在(ns)之中,下面是實踐中總結的幾種用法(下文中省略ns宏,只是給出:require的代碼):
一、導入完整名稱空間。
1,最簡單的形式:
(:require clojure.data.json)
2,同時導入同一名稱空間的多個子名稱空間:
(:require (clj-time core format ))
以上這兩種形式,導入了完整的名稱空間,使用起來就比較麻煩了,比如調用clojure.data.json的read-str函數:
(clojure.data.json/read-str "{\"a\":1}")
二、使用":as"關鍵字,給導入的名稱空間起一個別名。
(:require [clojure.data.json :as json])
這樣,調用其中函數時就可以使用這個別名而不是全路徑了:
(json/read-str "{\"a\":1}")
同時導入多個包的語法:
(:require [clj-time.core :as time] [clj-time.format :as timef] [clojure.data.json :as json] )
對於上面clj-time這種情況,導入多個子名稱空間,可以這樣:
(:require (clj-time [core :as time][format :as timef]) )
三、使用":refer"關鍵字,直接導入要使用的符號名稱(這種語法一般適用於僅需要使用的名稱空間中有限幾個符號的情況)。
例如只導入一個:
(:require [clojure.data.json :refer read-str])
此時,“read-str”直接位於當前的名稱空間,可以直接使用:
(read-str "{\"a\":1}")
同時導入多個符號名稱:
(:require [clojure.data.json :refer [read-str write-str] ])
還可以使用":all"關鍵字,這樣就和(use)宏的效果一樣了,把名稱空間下的所有符號直接導入到當前名稱空間,這是不推薦的,很容易引起衝突!例如:
user=> (:require [clojure.data.json :refer :all])
IllegalStateException pprint already refers to: #'clojure.pprint/pprint in namespace: user clojure.lang.Namespace.warnOrFailOnReplace (Namespace.java:88)