是:参考和:同时使用?

Ced*_*tin 4 alias namespaces clojure clojurescript

当我阅读Clojure代码(比如来自GitHub上的各种项目时)时,我有一些不太了解的东西:在:require表达式中,:as当你只使用你所指的函数时,你应该使用它:refer吗?此外,我不太确定Clojure和ClojureScript之间是否存在任何差异,也不存在任何约定.

例如(我正在使用猫库作为示例,但这只是一个示例)如果我这样做:

(ns example.core
  (:require
     [cats.core]
     [cats.monad.maybe :as maybe]))
Run Code Online (Sandbox Code Playgroud)

从REPL我可以这样做:

REPL> (cats.core/mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

但它不是很方便,所以我可以这样做:

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

REPL> (m/mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

现在,如果我一直使用mappend(和其他几个),我可以这样做:

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

REPL> (mappend (maybe/just 1))
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:是否有在同时使用任何用途:as:refer,就像下面的例子吗?

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

我知道我可以使用,也就是说,mappend所有的时间和可能想直接把它称为mappend,但bind不是经常使用:refer,但往往不够,这样写cats.core/bind是不是方便,所以我会使用m/bind

那么有什么规则吗?就像你正在使用:as你不应该使用:refer,或者反过来?或者你应该总是同时使用两者?

那么ClojureScript,它的工作方式是否完全相同?

Ale*_* C. 7

你是对的用例; 你经常使用的东西,你可能想:refer直接,否则,只需使用:as别名来访问它.两者都没有问题.

我个人倾向于更喜欢,:as除非它非常清楚:refered函数来自哪个命名空间(例如,我会认识到>!!没有前缀,但发现m/bind更具可读性).

最广泛使用的风格指南AFAIK表明,在结合使用它们是好的,但更喜欢:as:refer在大多数情况下:https://github.com/bbatsov/clojure-style-guide#comprehensive-ns-declaration

Clojurescript应该是完全一样的:refer,并:asns.