【Clojure 基本知識】 ns宏的 指令(關鍵字) requrie的用法

    指令(: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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章