apo*_*nur 13 variables import namespaces clojure
我的理解是现在建议使用
require :refer而不是use在ns宏中使用.例如,执行:
(ns example.core
(:require [clj-json.core :refer [parse-string]]))
Run Code Online (Sandbox Code Playgroud)
代替
(ns example.core
(:use [clj-json.core :only [parse-string]]))
Run Code Online (Sandbox Code Playgroud)
处理:rename哪些use支持的推荐方法是什么?具体来说,假设我想require
clojure.data.zip和重命名ancestors以及descendants功能与clojure.core冲突.
换句话说,我想知道require等效的
(:use
[clojure.data.zip :rename {ancestors xml-ancestors,
descendants xml-descendants})
Run Code Online (Sandbox Code Playgroud)
use*_*062 13
(ns foo
(:require [clojure.data.zip :refer [ancestors descendants] :rename {ancestors xml-ancestors descendants xml-descendants}]))
Run Code Online (Sandbox Code Playgroud)
ama*_*loy 12
您:require一步到位,然后:refer用:rename在未来.
(ns foo
(:require clojure.data.zip)
(:refer [clojure.data.zip :rename {ancestors xml-ancestors,
descendants xml-descendants})
Run Code Online (Sandbox Code Playgroud)
:use一直是:require+ 的简写:refer,现在:refer选择:require是最简单的简写refer.
免责声明:我不知道“推荐”的方法来做到这一点。我只知道我会怎么做。我的解决方案可能不是惯用的 Clojure,如果没有人提出更好的答案,我会感到惊讶。
这就是我要做的::require使用的包和别名:as:
(ns some.big.name.space
(:require [clojure.data.zip :as cdz])
... some more imports, maybe ...)
Run Code Online (Sandbox Code Playgroud)
然后可以使用指定的前缀访问符号,并且不会与我的some.big.name.space命名空间中的任何符号冲突:
(def some-list [cdz/ancestors cdz/descendants ancestors descendants])
Run Code Online (Sandbox Code Playgroud)
如果别名很短,我输入它几乎不会打扰我,而且我觉得我的代码更清晰——这cdz/是一个很好的视觉提示,表明该符号是导入的。
我知道这并不能真正回答你的确切问题——如何使用:renamewith——:require但我觉得值得一提,因为它避免了污染我的命名空间,而且我不必搞乱 Clojure 的符号解析机制。
| 归档时间: |
|
| 查看次数: |
2894 次 |
| 最近记录: |