使用と必要の違い


回答:


101

require(すでにロードされていない)の負荷のLIBS、use同じことをプラスして、それが彼らの名前空間を参照してclojure.core/refer(あなたはまた、使用の可能性を得るように:excludeと同じようになどclojure.core/refer)。どちらnsも直接ではなくで使用することをお勧めします。


3
lib fooが必要な場合、fooでbarを使用するには、毎回foo / barを記述する必要がありますよね?libをnsにロードしたいのに、それをnsに参照しないのはなぜですか?衝突を心配しているかもしれませんし、衝突を調整する必要がないようにしたくないのではないでしょうか?
Jegschemesch、2009年

12
衝突を調整する必要がないことは良い点であり、より一般的には、「名前空間は非常にすばらしいアイデアであるので、もっと多くのものが必要です」(「The Zen of Python」から)というプログラミングスタイルがあります。 「using namespace foo;」を使用しない C ++では、コードのリーダーとメンテナーが「このバーはどこから来るのか」を心配する必要はありませんが、代わりに、より明示的なfoo :: barを参照してください。require(対use)は、この「明示的な名前空間」スタイルをサポートしています。
Alex Martelli、

2
アレックスは良いが時代遅れの答えを出します。@overthinkが以下に指摘するように、この回答が与えられた後、慣用的なclojureは、過剰使用を推奨します。参照:dev.clojure.org/jira/browse/CLJ-879
Phil Cooper

これは受け入れられ、最も投票された回答ですが、古く、時代遅れの見解を表しています。より良い答えは、@ rzvからのものです:stackoverflow.com/a/16429572/172272
Didier A.

65

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 foo :only [bar])とは(:require foo :refer [bar])?これを行うには2つの方法があるのは奇妙に思えます。
overthink

10
stackoverflow.com/a/10370672/69689が私の質問に答えるように見えます。つまり(:require .. :refer ..)、は、同じことを行う新しい方法であり、を効果的に廃止することができます:useが、いくつかの欠点があります。
overthink

良い例を示します。私は例が大好きです、これはとても理にかなっています。
Astrid 2015年

35

関数を呼び出すたびに名前空間を入力する必要がないため、確実に使用すると名前空間の競合が発生し、混乱を招く可能性があります。"use"と "require"の間の良い中間点は、実際に使用する名前空間の関数のみを "使用"することです。

例えば:

 ( '[clojure-contrib.duck-streams:only(writer reader)]を使用))
さらに良いのは、名前空間定義のファイルの先頭でそれを指定することです:

(ns com.me.project
   (:use [clojure.contrib.test-is:only(deftest is run-tests)]))

3
(ns ...)構文を(しゃれた)含めてくれてありがとう。私はそれを探していましたが、私が見つけた例はすべて単純なもの(use ...)でした。
ポール・

1
更新:このメソッドは廃止されました(require '[namepase :refer [var-name1 var-name2]])
アーサーウルフェルト2014

@ArthurUlfeldtこれを含める(しゃれる)ように回答を更新することができます。
bfontaine

20

前述のように、大きな違いは、(require 'foo)を使用して、libの名前空間の名前を次のように参照する(foo/bar ...)ことです。(use 'foo)そうすると、それらは現在の名前空間にあります(競合がない場合は何でも)、次のように呼び出すことができます。彼らは好き(bar ...)です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.