简单的问题。我是Clojure的新手。

如何在我的项目中使用另一个文件中的一个文件?基本上,我如何包含,导入或要求另一个文件?不是来自库,而是来自我自己的代码。

谢谢,
亚历克斯

最佳答案

通常,您将希望使用与库代码相同的方法,即对 namespace 进行use/require(通过文件顶部的ns形式,有时通过REPL中的use/require函数)。为此,您必须确保它们在类路径中。简短说明:

  • 遵循通常的Clojure项目结构:包含所有源文件的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。但是,这超出了此问题的范围。)
    顺便说一句,我已经以“通常”一词开始了这个答案,因为您还可以使用loadin-ns之类的东西将单个 namespace 拆分为多个文件。但是,在大多数情况下,这并不是您真正想做的。只需使用经过深思熟虑的 namespace 布局即可。

    关于clojure - 如何在我的项目中使用另一个文件中的一个文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2459405/

    10-12 07:33
    查看更多