web-dev-qa-db-ja.com

useとrequireの違い

userequireの違いを、直接使用した場合と:useおよび:requirensマクロ内で?

148
Jegschemesch

requireは(まだロードされていない)ライブラリをロードします、useは同じことをしますplusclojure.core/refer (したがって、:excludeのようにclojure.core/referなどを使用することもできます)。両方を直接ではなくnsで使用することをお勧めします。

97
Alex Martelli

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名前空間についてさらに学ぶためのリソースとして、 このブログ を強くお勧めします。

59
rzv

確かに、名前空間の競合を作成することで物事を混乱させることもできますが、関数を呼び出すたびに名前空間を詳しく説明する必要がないので、確実に使いやすくなります。 "use"と "require"の中間点は、実際に使用する名前空間の関数のみを「使用」することです。

例えば:

( '[clojure-contrib.duck-streams:only(writer reader)]を使用))..____。]
(ns com.me.project 
(:use [clojure.contrib.test-is:only(deftest is run-tests)]))
33
Arthur Ulfeldt

前述のように、大きな違いは、(require 'foo)では、次のようにlibの名前空間の名前を参照することです:(foo/bar ...)(use 'foo)にすると、現在の名前空間に存在することになります(競合がない場合でも)。 (bar ...)のように呼び出すことができます。

18
Chris