clojure-:refer vs:as

boa*_*oaz 2 performance clojure

我正在学习Clojure。作为该:require过程的一部分,有一个选项可:refer用于特定方法或所有方法。

或使用:as,然后选择所需的方法。

我想我明白了2个选项之间的差异,也看到了文档在这里,上面写着:

:as将符号作为其参数,并使该符号成为当前名称空间中lib名称空间的别名。

:refer接受要从名称空间引用的符号列表,或:all关键字以引入所有公共变量。

但是我仍然不确定:

  1. 什么时候应该使用一个选项而不是另一个?

  2. 是否有性能差异的两个选项之间?(我的想法是说没有,因为Compillar会优化这两种选择

(我还做了两个使用小程序core.asyc,一个使用:as和一个使用:refer。运行两个程序所需的时间几乎相同。

Ala*_*son 7

我几乎总是这样使用:as

(ns demo.core
  (:require
    [clojure.string :as str] ))

(println (str/join ["hello" "there"]))
Run Code Online (Sandbox Code Playgroud)

这使读者可以看到join属于str(名称空间别名),并且可以轻松地看到join解析为clojure.string/join

考虑替代方案:

(ns demo.core
  (:require
    [clojure.string :refer [join] ))

<snip>
...397 lines of other code...
</snip>

(println (join ["hello" "there"]))
Run Code Online (Sandbox Code Playgroud)

这里join看起来像中定义的局部函数demo.core,读者可能需要一段时间才能弄清它的来源。他们仍然可以通过在ns声明中查找来追踪来源,但是除非它是一个非常常用的功能,否则大多数人都同意,在读取您未编写的代码时,名称空间别名技术更容易/更快捷。


在执行过程中,编译器会将两种形式都转换为相同的机器代码,因此两者之间没有区别。