사용과 요구의 차이


155

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


2
ns 매크로와 관련하여 stackoverflow.com/questions/10358149/… 도 참조하십시오 . clojure 1.4에서는 다음을 사용하는 것이 좋습니다 : use를 선호합니다 : use
Korny

답변:


101

require(아직로드되지 않음)로드 libs와, use같은 않습니다 플러스 는 자신의 네임 스페이스를 참조 clojure.core/refer(당신은 또한 사용할 수있는 가능성 얻을 수 있도록 :exclude와 같은 등 clojure.core/refer). 둘 다 ns직접 사용 하지 말고 사용하는 것이 좋습니다 .


3
lib foo가 필요한 경우 foo에서 bar를 사용하려면 매번 foo / bar를 작성해야합니까? 왜 lib를 ns에로드하고 n을 참조하지 않겠습니까? 나는 당신이 충돌에 대해 걱정할지도 모른다고 생각하고, 당신은 그것들을 조정하지 않아도되고 싶지 않습니까?
Jegschemesch

12
충돌을 조정하지 않아도된다는 것이 좋은 지적이며, 더 일반적으로 "네임 스페이스는 훌륭한 아이디어입니다. 더 많은 것을 가져야합니다"( "The Zen of Python")와 같은 프로그래밍 스타일이 있습니다. "네임 스페이스 foo 사용"을 사용하지 않는 것 C ++에서는 코드의 독자와 관리자가 "이 막대의 출처"에 대해 걱정할 필요가 없지만보다 명백한 foo :: bar를 참조하십시오. require (vs use)는이 "명시적인 네임 스페이스"스타일을 지원합니다.
Alex Martelli

2
Alex는 훌륭하지만 구식 답변을 제공합니다. @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])있습니까? 이 작업을 수행하는 두 가지 방법이 이상하게 보입니다.
overthink

10
stackoverflow.com/a/10370672/69689가 내 질문에 답변하는 것 같습니다 . 한마디로 : (:require .. :refer ..)효과적으로 비추천 할 수있는 것과 같은 일을하는 새로운 방법 :use입니다. 이에는 몇 가지 단점이 있습니다.
overthink

좋은 예입니다. 나는 예를 좋아하는데, 이것은 의미가 있습니다.
Astrid

35

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

예를 들어 :

 ( '[clojure-contrib.duck-streams : only (writer reader)] 사용)
또는 네임 스페이스 정의에서 파일 맨 위에 지정하십시오.

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

3
(ns ...)구문 을 포함시켜 주셔서 감사 합니다. 나는 그것을 찾고 있었지만 내가 찾은 모든 예는 명백했다 (use ...).
paul

1
업데이트 :이 방법에 찬성 지금은 더 이상 사용되지 않습니다(require '[namepase :refer [var-name1 var-name2]])
아서 Ulfeldt

@ArthurUlfeldt 이것을 포함하도록 (pun) 답을 업데이트하고 싶을 수도 있습니다.
bfontaine

20

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.