当我阅读Clojure代码(比如来自GitHub上的各个项目)时,我不太了解这些内容:在:require
表达式中,当你只是:as
时,你是否应该使用:refer
使用您使用(ns example.core
(:require
[cats.core]
[cats.monad.maybe :as maybe]))
引用的功能?此外,我不太确定Clojure和ClojureScript之间是否存在任何差异,也不存在任何惯例。
例如(我正在使用猫库作为示例,但这只是一个示例)如果我这样做:
REPL> (cats.core/mappend (maybe/just 1))
来自,例如,REPL,我可以这样做:
(ns example.core
(:require
[cats.core :as m]
[cats.monad.maybe :as maybe]))
REPL> (m/mappend (maybe/just 1))
但它不是很方便,所以我可以这样做:
mappend
如果我一直使用(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
据我所知,我可能一直在使用mappend
,并且可能希望直接将其称为bind
,但:refer
不是经常使用cats.core/bind
但是还经常足以写m/bind
不方便,所以我会使用:as
?
那么有什么规则吗?就像你使用:refer
一样,你不应该使用has_many :survey_group_lists, -> { order 'sequence ASC, group_id ASC' }
has_many :groups, through: :survey_group_lists
,反之亦然?或者你应该总是同时使用它们?
ClojureScript怎么样,它是否以完全相同的方式工作?
答案 0 :(得分:7)
你对用例很正确;你经常使用的东西,你可能想直接:refer
,否则,只需使用:as
别名来访问它。两者都没有问题。
我个人倾向于选择:as
,除非它非常清楚:refer
ed函数来自哪个命名空间(例如,我会认为>!!
没有前缀,但是找到{ {1}}更具可读性。)
最广泛使用的样式指南afaik建议结合使用它们很好,但在大多数情况下更喜欢m/bind
到:as
:https://github.com/bbatsov/clojure-style-guide#comprehensive-ns-declaration
:refer
中的:refer
和:as
的Clojurescript应完全相同。