【问题标题】:Clarifying Clojure "Use as" semantics澄清 Clojure “用作”语义
【发布时间】:2015-06-04 19:04:52
【问题描述】:

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

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 1970-01-01
        • 1970-01-01
        • 2018-09-28
        • 2014-02-12
        • 2013-09-10
        相关资源
        最近更新 更多