2017-05-10 1 views
4

Clojure 코드 (GitHub의 다양한 프로젝트에서 말한 것)를 읽을 때 이해할 수없는 부분이 있습니다. :require 표현식에서 사용하고있는 함수 만 사용하는 경우 :as을 사용해야합니다. :refer? 또한 그 관점에서 Clojure와 ClojureScript 사이에 차이가 있는지, 어떤 규칙이 있는지는 확실하지 않습니다.Are :를 참조하십시오 : 동시에 사용 하시겠습니까?

예를 들어 (나는 예는 고양이 라이브러리를 사용하고 있지만, 그건 그냥 예입니다) 나는이 할 경우 :

말에서
(ns example.core 
    (:require 
    [cats.core] 
    [cats.monad.maybe :as maybe])) 

의 REPL 나는이 작업을 수행 할 수 있습니다

REPL> (cats.core/mappend (maybe/just 1)) 

그러나 그것은 매우 편리하지, 그래서 내가 대신이 작업을 수행 할 수 있습니다

(ns example.core 
    (:require 
    [cats.core :as m] 
    [cats.monad.maybe :as maybe])) 

REPL> (m/mappend (maybe/just 1)) 

이제 경우에 나는을 사용(그리고 몇 가지 다른) 모든 시간, 내가 할 수있는 :

(ns example.core 
    (:require 
    [cats.core :refer [mappend]] 
    [cats.monad.maybe :as maybe])) 

REPL> (mappend (maybe/just 1)) 

그래서 내 질문은 : 다음 예에서와 같이 모두 :as:refer을 사용하여 어떤 사용이?

(ns example.core 
    (:require 
    [cats.core :as m :refer [mappend]] ; does this make any sense? 
    [cats.monad.maybe :as maybe])) 

은 내가, 말, mappend 모든 시간을 사용 할 수 있으며, 자주 그 cats.core/bind를 작성 그래서 아직을 :refer하지만 를 사용하여 mappend하지만 같은 것을 자주 bind하지로 직접 참조 할 수 있음을 이해 편리하지 않아서 m/bind을 사용하고 싶습니까?

그렇다면 어떤 규칙이 있습니까? :as을 사용하는 경우와 마찬가지로 :refer을 사용하면 안되며 다른 방법으로 사용 하시겠습니까? 아니면 항상 둘 다 사용해야합니까?

ClojureScript는 정확히 같은 방식으로 작동합니까?

답변

7

사용 사례가 맞습니다. 자주 사용하는 항목은 :refer으로 직접 지정하거나 그렇지 않으면 :as 별칭을 사용하여 액세스 할 수 있습니다. 둘 다 할 때 아무런 문제가 없습니다.

는 개인적으로 매우 명확하지 않는 :as을 선호하는 경향이 무엇 :refer 에디션 기능 (예를 들어 내가 접두사없이 >!!을 인식하지만, m/bind 더 읽기 찾을 것이다)에서 온 네임 스페이스.

가장 널리 사용되는 스타일 가이드는 AFAIK 함께 그들을 사용하는 것은 괜찮 것을 제안하지만, 대부분의 경우 :refer:as을 선호 : https://github.com/bbatsov/clojure-style-guide#comprehensive-ns-declaration

Clojurescript 정확히 할 수 ns에서 :refer:as에 대해 동일합니다.

+1

예, 네임 스페이스 접두어없이'core : async 'primitives'를 사용하려고 할 때 (': refer [!]')와 같은 충돌을 피할 필요가있을 때와 같이 동시에 둘 다 사용하려고 할 때가 있습니다. Clojure 코어 ('async/into'). – glts

+0

@glts : 아 매우 흥미 롭습니다. 그리고 나는 충돌에 대해 생각하지 않았습니다. 많은 의미가 있습니다. 둘 다 감사합니다. –

관련 문제