use
とrequire
の違いを、直接使用した場合と:use
および:require
ns
マクロ内で?
require
は(まだロードされていない)ライブラリをロードします、use
は同じことをしますplusclojure.core/refer
(したがって、:exclude
のようにclojure.core/refer
などを使用することもできます)。両方を直接ではなくns
で使用することをお勧めします。
require
およびrefer
を使用して外部関数を含めるのは慣用的です。名前空間の競合を避け、実際に使用/必要な関数のみを含め、各関数の場所を明示的に宣言します。
(ns project.core
(:require [ring.middleware.reload :refer [wrap-reload]]))
名前空間を接頭辞としてこの関数を呼び出す必要はありません。
(wrap-reload) ; works
refer
を使用しない場合は、名前空間に接頭辞を付ける必要があります。
(ring.middleware.reload/wrap-reload) ; works if you don't use refer in your require
代わりにuse
を選択した場合、(ほとんど)常にonly
を使用します。
(ns project.core
(:use [ring.middleware.reload :only [wrap-reload]]))
それ以外の場合は、すべてを含めているため、不必要に大きな操作になり、他のプログラマーが関数の場所を見つけるのに非常に混乱します。
また、Clojure名前空間についてさらに学ぶためのリソースとして、 このブログ を強くお勧めします。
確かに、名前空間の競合を作成することで物事を混乱させることもできますが、関数を呼び出すたびに名前空間を詳しく説明する必要がないので、確実に使いやすくなります。 "use"と "require"の中間点は、実際に使用する名前空間の関数のみを「使用」することです。
例えば:
( '[clojure-contrib.duck-streams:only(writer reader)]を使用))..____。]
(ns com.me.project (:use [clojure.contrib.test-is:only(deftest is run-tests)]))
前述のように、大きな違いは、(require 'foo)
では、次のようにlibの名前空間の名前を参照することです:(foo/bar ...)
を(use 'foo)
にすると、現在の名前空間に存在することになります(競合がない場合でも)。 (bar ...)
のように呼び出すことができます。