澄清 Clojure "Use as" 语义

Clarifying Clojure "Use as" semantics

(use '[clojure.string :as str]) 的效果似乎是将 clojure.string 中的所有内容加载到当前命名空间中,而无需命名空间限定。 (use '[clojure.string :as str :only (join)]) 的效果似乎只加载到当前命名空间中,使 clojure.string 命名空间的其余部分可以使用 str/ 前缀访问。有什么方法可以简单地使整个 clojure.string 命名空间可以通过 str/ 前缀访问,而无需选择我想直接导入当前命名空间的任何名称?

require 是引用其他名称空间的首选方法。您使用 :as 为您需要的名称空间提供前缀。您可以使用 :refer 将特定符号引用到命名空间中,而无需进行限定。如果要将所有符号导入命名空间,可以使用 :all 代替符号名称,但应限制其使用。

use 不再使用太多并且被避免,因为它使得更难理解不合格符号的来源。我什至没有意识到 use 可以提供 :as,它没有列在文档字符串中。

请注意,Clojure 源代码文件中使用的格式与 REPL 中使用的格式不同,如果将它们混淆,可能会造成混淆。在源代码文件中,使用了 ns 宏:

(ns example.core
  (:require [clojure.string    :as str]
            [datomic.api       :as d] ))

所以我们使用 :require 关键字 (带冒号),并且名称空间规范向量未加引号。与您需要在 repl 中键入的内容进行比较:

(require '[clojure.string :as str])

我们在其中调用 require 函数 (没有冒号),因此必须引用命名空间规范向量。