[clojure] 사용과 요구의 차이

사람 사이의 차이를 설명 할 수 userequire양으로 직접 사용하는 경우 :use:require에서 ns매크로?



답변

require(아직로드되지 않음)로드 libs와, use같은 않습니다 플러스 는 자신의 네임 스페이스를 참조 clojure.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 네임 스페이스에 대한 자세한 정보를 얻을 수있는 리소스로 강력히 권장 합니다.


답변

함수를 호출 할 때마다 네임 스페이스를 철자하지 않아도되므로 네임 스페이스 충돌을 일으켜 문제를 일으킬 수도 있지만,이를 사용하면보다 쉽게 ​​만들 수 있습니다. “사용”과 “필수”사이의 좋은 중간 근거는 실제로 사용하는 네임 스페이스의 함수 만 ‘사용’하는 것입니다.

예를 들어 :

 ( '[clojure-contrib.duck-streams : only (writer reader)] 사용)

또는 네임 스페이스 정의에서 파일 맨 위에 지정하십시오.

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


답변

로 큰 차이를 언급하고있다으로한다는 것입니다 (require 'foo), 당신은 다음과 같이 lib 디렉토리의 이름 공간에 이름을 참조 : (foo/bar ...)당신이 경우에 (use 'foo)그들은 현재 네임 스페이스에있다 (즉,하고 충돌이없는 제공 무엇이든) 당신이 호출 할 수 있습니다 그들처럼 (bar ...).


답변