何时使用别名以及何时使用:请参阅Clojure / ClojureScript:require?

时间:2014-09-10 13:46:41

标签: clojure clojurescript

在Clojure或ClojureScript中使用:require时,何时应该使用别名?何时应该只选择您使用的函数?

示例:

  1. 使用别名

    (:require [some-package.sub as some])
    
    (some/do-stuff "xyz")
    
  2. 使用:refer

    (:require [some-package.sub :refer [do-stuff]])
    
    (do-stuff "xyz")
    
  3. 如果依赖项有很多你想要使用的函数,或者你使用它的所有函数(无论有多少函数),使用别名似乎更方便,特别是因为ClojureScript(故意)不支持{{1} }。另一方面,使用:refer :all似乎更像"清洁"方法,特别是当只使用依赖项中的某些特定函数时。

    在两者之间进行选择时是否还应考虑其他事项(这首先是一个正当理由)?

    我能想到的另一件事是,如果你在文件中定义了很多自己的函数的依赖关系和/或加载,那么在函数调用中使用别名前缀可能会使这些函数更清晰。即使您只使用依赖项提供的一小部分函数,​​也会找到它们。

    我该如何选择使用哪一个?或者你应该在你的开发团队中做出决定,只要你坚持一种方法,一切都很好吗?

2 个答案:

答案 0 :(得分:5)

使用别名可以让任何读取代码的人明确定义特定变量,尤其是在标准化所有项目中使用别名时。

非限定名称my-fn可以参考:

  • 当前名称空间中定义的var my-fn
  • 在其他名称空间中定义的var my-fn,使用:require :refer别名进入当前名称空间
  • 名为my-fn的本地词法绑定(即函数参数或let-bound变量)。

限定名称a/my-fn只能引用:

  • 另一个名称空间中的变量my-fn别名为a(如果您顽皮并且使用单段名称空间,则名称空间为a。)
  • 不常见的是,Java类my-fn中名为a的静态方法或字段。

对于当前命名空间中定义的任何内容,不能混淆限定名称,并且因为您不能使用限定名称作为函数参数或在let绑定中使用,所以没有被本地词汇绑定所掩盖的风险。使用:require :refer可以放弃这种清晰度而不会给你太多回报,我认为应该谨慎使用。

答案 1 :(得分:4)

这是主观的,但我几乎只使用别名。唯一的例外是当我有一个命名空间使用另一个命名空间中的一个或两个函数 lot 时,以消除噪音。例如,我通常会从deftest引用clojure.test。但是,我从不提及两个以上的功能。

请注意,您可以同时使用:refer:as

(ns my-ns
   (:require [clojure.test :as test :refer [deftest]]))
相关问题