澄清 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
函数 (没有冒号),因此必须引用命名空间规范向量。
(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
函数 (没有冒号),因此必须引用命名空间规范向量。