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

    指令(:require)用在(ns)之中,下面是實踐中總結的幾種用法(下文中省略ns宏,只是給出:require的代碼):java

1、導入完整名稱空間。json

1,最簡單的形式:函數

(:require   clojure.data.json)

2,同時導入同一名稱空間的多個子名稱空間:ui

(:require (clj-time  core  format ))

以上這兩種形式,導入了完整的名稱空間,使用起來就比較麻煩了,好比調用clojure.data.json的read-str函數:spa

(clojure.data.json/read-str "{\"a\":1}")

 

2、使用":as"關鍵字,給導入的名稱空間起一個別名。code

(:require  [clojure.data.json :as json])

這樣,調用其中函數時就能夠使用這個別名而不是全路徑了:orm

(json/read-str "{\"a\":1}")

同時導入多個包的語法:blog

    (:require [clj-time.core :as time]
        [clj-time.format :as timef]
        [clojure.data.json :as json]
    )

對於上面clj-time這種狀況,導入多個子名稱空間,能夠這樣:it

 (:require (clj-time [core :as time][format :as timef]) )

 

3、使用":refer"關鍵字,直接導入要使用的符號名稱(這種語法通常適用於僅須要使用的名稱空間中有限幾個符號的狀況)。io

例如只導入一個:

(: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)
相關文章
相關標籤/搜索