简单的问题。我是 Clojure 的新手。
如何在另一个文件中使用我项目中的一个文件?基本上我如何包含、导入或需要另一个文件?不是来自图书馆,而是来自我自己的代码。
谢谢,
亚历克斯
最佳答案
通常,您会希望使用与库代码相同的方法,即 use
/require
您的命名空间(通过文件顶部的 ns
表单,有时是 REPL 中的 use
/require
函数)。为此,您必须确保它们在类路径上。一个简短的指南:
src/
包含所有源文件的目录,其中文件 src/foo/bar/baz.clj
定义了一个名为 foo.bar.baz
的命名空间.请注意您必须维护目录结构/命名空间名称结构对应关系;否则事情就行不通了。另请注意,您不得使用 _
命名空间名称中的字符或 -
文件名中的字符(连字符)以及每当您使用 _
在文件名中,您必须使用 -
在命名空间名称中(反之亦然)。最后,Maven 项目的目录层次结构会稍微复杂一些,但现在不要担心(除非您已经是 Maven 的熟练用户,在这种情况下对你来说不会有问题)。另见 this answer of mine有关使用 Clojure 处理 Java 类路径的早期 SO 问题,以获取对文件系统层次结构/类路径层次结构对应关系的更详细的逐步说明。
foo.bar
命名空间需要使用来自 foo.quux.baz
的代码命名空间,做类似 (ns foo.bar (:require [foo.quux.baz :as baz]))
的事情在 foo/bar.clj
并从 baz
调用函数如 baz/some-function
.或者你可以把 (:use foo.quux.baz)
在 ns
而是直接调用它们(没有命名空间限定符,例如 some-function
)。这与您对库代码所做的完全相同。使用 REPL 中的项目代码时,请确保包含
src/
目录(目录本身,而不是其中的任何文件)。 您可能应该考虑使用一些工具为您自动化 REPL 设置(包括类路径管理); Leiningen非常受 Clojurians 的欢迎,并且也有将 Maven 与 Clojure 一起使用的插件。警告:您的 JVM 启动命令可能(实际上,可能会)识别名为
$CLASSPATH
的环境变量。 .至于它和你的 Clojure 项目的关系,嗯,基本上应该没有。更有可能的是,您的项目每个都需要不同的类路径,其中一些可能使用与其他人所需的不兼容的某些 jar 版本(特别是如果您使用 Clojure 1.1——最新的稳定版本——对于某些项目,同时进行试验与其他人的 1.2 快照)。因此,管理类路径的正确方法是为每个项目准备一个最小版本并将其传递给 JVM 启动命令。如前所述,您应该花一些时间学习使用一个好的工具(如上面提到的 Leiningen)尽快为您设置类路径,这样您就不需要自己关心这个了。(作为旁注,在某些情况下,您可能需要添加的不仅仅是
src/
目录和您的 jar
s 到类路径,例如,如果您计划调用 compile
来生成 .class
文件,您'也必须将目标目录放在类路径上。不过,这超出了这个问题的范围。)顺便说一句,我已经用“正常”这个词开始了这个答案,因为你也可以使用像
load
这样的东西。 & in-ns
将单个命名空间拆分为多个文件。不过,在大多数情况下,这并不是您真正想要做的;只需使用经过深思熟虑的命名空间布局即可。
关于clojure - 如何在另一个文件中使用我项目中的一个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2459405/