简单的问题。我是Clojure的新手。
如何在我的项目中使用另一个文件中的一个文件?基本上,我如何包含,导入或要求另一个文件?不是来自库,而是来自我自己的代码。
谢谢,
亚历克斯
最佳答案
通常,您将希望使用与库代码相同的方法,即对 namespace 进行use
/require
(通过文件顶部的ns
形式,有时通过REPL中的use
/require
函数)。为此,您必须确保它们在类路径中。简短说明:
src/
目录,其中src/foo/bar/baz.clj
文件定义了一个名为foo.bar.baz
的命名空间。请注意,您必须维护目录结构/ namespace 名称结构的对应关系;否则事情将无法进行。还要注意,您不得在 namespace 名称中使用_
字符或在文件名中使用-
字符(连字符),并且每当您在文件名中使用_
时,都必须在 namespace 名称中使用-
(反之亦然)。 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
形式中,而不是直接调用它们(不使用 namespace 限定符,例如some-function
)。这与您对库代码所做的完全相同。在使用REPL中的项目代码时,请确保在类路径中包括
src/
目录(目录本身,而不是其中的任何文件)。 您可能应该考虑使用一些工具为您自动执行REPL设置(包括类路径管理)。 Leiningen在Clojurians中非常流行,并且也有一些插件可以将Maven与Clojure一起使用。警告:您的JVM启动命令可能(实际上,可能会)识别出一个名为
$CLASSPATH
的环境变量。至于它与Clojure项目的关系,基本上应该没有任何关系。您的项目很有可能会各自需要一个不同的类路径,其中某些可能使用的某些jar版本与其他人所需要的jar版本不兼容(特别是如果您正在对某些项目使用Clojure 1.1(最新的稳定版本)进行试验)与其他人一起创建1.2快照)。因此,管理类路径的正确方法是为每个项目准备一个最低版本,并将其传递给JVM启动命令。如前所述,您应该花一些时间学习使用一个好的工具(例如上面提到的Leiningen)来尽快为您设置类路径,这样您就不必自己关心它了。(作为附带说明,在某些情况下,您可能不仅需要向类路径中添加
src/
目录和jar
,例如,如果您计划调用compile
来生成.class
文件,则必须将目标目录放在同样是classpath。但是,这超出了此问题的范围。)顺便说一句,我已经以“通常”一词开始了这个答案,因为您还可以使用
load
和in-ns
之类的东西将单个 namespace 拆分为多个文件。但是,在大多数情况下,这并不是您真正想做的。只需使用经过深思熟虑的 namespace 布局即可。关于clojure - 如何在我的项目中使用另一个文件中的一个文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2459405/