Julia圆形包含

Julia圆形包含,julia,Julia,我的目标是:对于一个项目,能够包含本地文件(同一个项目的一部分,同一个确切的目录),非常简单,可能是循环的 在Julia中,假设我有以下文件: 文件1.jl module A include("FILE2.jl") using B # Type annotations that need types from B end 文件2.jl module B include("FILE1.jl") using A # Type annotations

我的目标是:对于一个项目,能够包含本地文件(同一个项目的一部分,同一个确切的目录),非常简单,可能是循环的

在Julia中,假设我有以下文件:

文件1.jl

module A

include("FILE2.jl")
using B

# Type annotations that need types from B

end
文件2.jl

module B

include("FILE1.jl")
using A

# Type annotations that need types from A

end
在Julia(>v1)中,这将导致无限循环。我已经尝试将文件添加到我的加载路径,以便可以直接使用using或import,但它仍然找不到这些文件


假设存在循环依赖关系,并且是同一项目的一部分,那么在同一目录中包含文件的“Julian”方式是什么?我看到很多帖子都说“如果是这样的话,你的代码可能是错的”,我认为这只是一个愚蠢的说法。

一个常见的结构是将所有
包含在一个地方,放在项目的根上。这是一个很好的例子

如果项目非常大,人们可以使用
模块
对其进行细分,但您不需要这样做!大型项目可以由单个模块组成。我建议只将一段代码分割成它自己的模块,如果它作为一个独立的整体是有意义的。(其他人对此可能有不同的看法!)但既然您询问了循环引用,那么单个模块似乎更适合您的情况

模块不能包含循环引用:

# will not work
module A
    import ..B: y
    x = 1
end
module B
    import ..A: x
    y = 1
end
这不是函数的问题:

function a(x)
    if x < 1
        1
    else
        b(x-1) * 2
    end
end

function b(x)
    a(x)
end

b(10)
函数a(x)
如果x<1
1.
其他的
b(x-1)*2
终止
终止
功能b(x)
a(x)
终止
b(10)

函数可以使用在其自身定义之后定义的类型、函数、常量和模块。

常见的结构是将所有
包含的
放在项目根目录的一个位置。这是一个很好的例子

如果项目非常大,人们可以使用
模块
对其进行细分,但您不需要这样做!大型项目可以由单个模块组成。我建议只将一段代码分割成它自己的模块,如果它作为一个独立的整体是有意义的。(其他人对此可能有不同的看法!)但既然您询问了循环引用,那么单个模块似乎更适合您的情况

模块不能包含循环引用:

# will not work
module A
    import ..B: y
    x = 1
end
module B
    import ..A: x
    y = 1
end
这不是函数的问题:

function a(x)
    if x < 1
        1
    else
        b(x-1) * 2
    end
end

function b(x)
    a(x)
end

b(10)
函数a(x)
如果x<1
1.
其他的
b(x-1)*2
终止
终止
功能b(x)
a(x)
终止
b(10)

函数可以使用类型、函数、常量和模块,这些类型、函数、常量和模块都是在其自身定义之后定义的。

只是为了澄清一下:我认为您在这里混淆了两个概念。模块本质上是名称空间。它们与文件没有太多关系:单个Julia源文件可以定义多个模块,或者单个Julia模块可以将其实现拆分为多个文件。我之所以提到这一点,是因为您似乎已经习惯了Python,在Python中(AFAIU),大多数情况下源文件和模块之间是直接的一对一映射。这一点,以及Python和Julia之间的其他区别,都在中提到了。您能解释一下为什么会出现这种循环依赖关系吗?换句话说,这两个文件/模块以何种方式相互依赖?我更新了格式问题,以更好地反映我正在尝试做的事情。如果我在当前环境中注册我的软件包,是否可以在不使用include?作为更新的情况下找到它?我不希望每个文件包含多个模块的文件。最后,我希望一个模块定义一个或几个抽象类型,然后定义一些扩展该类型的具体结构,以及一些方法。具体结构中的字段可能依赖于其他模块中定义的抽象类型,也可能是循环的。模块本质上是名称空间。它们与文件没有太多关系:单个Julia源文件可以定义多个模块,或者单个Julia模块可以将其实现拆分为多个文件。我之所以提到这一点,是因为您似乎已经习惯了Python,在Python中(AFAIU),大多数情况下源文件和模块之间是直接的一对一映射。这一点,以及Python和Julia之间的其他区别,都在中提到了。您能解释一下为什么会出现这种循环依赖关系吗?换句话说,这两个文件/模块以何种方式相互依赖?我更新了格式问题,以更好地反映我正在尝试做的事情。如果我在当前环境中注册我的软件包,是否可以在不使用include?作为更新的情况下找到它?我不希望每个文件包含多个模块的文件。最后,我希望一个模块定义一个或几个抽象类型,然后定义一些扩展该类型的具体结构,以及一些方法。具体结构的字段可能依赖于其他模块中定义的抽象类型,也可能是循环的。我仍然迷路。在FILE1.jl中,我定义了一些基本的抽象类型,它们都包含在模块A中。现在,我还有FILE2.jl。FILE2.jl没有任何模块(尽管这不重要),只有简单的代码。在FILE2.jl中,我想定义一个具体类型,该类型扩展模块a中的一个抽象类型。最后,我还想在FILE1.jl中包含FILE2.jl。我不想在FILE1.jl中直接存储FILE2.jl。这是一个很好的策略!在这种情况下,您只是将模块A的代码拆分为多个文件。因此,在模块A中(在
结束
之前),您需要
包含(“FILE2.jl”)
。您应该将
包含(路径)
视为“从
路径
获取文本,并将其粘贴到此处”。在Python中,文件夹结构等于模块结构,在Julia中,您可以自己编写模块结构(如果需要),
include
只是一个复制粘贴命令。谢谢您的帮助。如何在不包含include(“FILE1.jl”)的情况下安全地将抽象类型提供给FILE2.jl的作用域,这将调用include(“FILE2.jl”)、inf loop..?文件不引入作用域,您应该将
include
视为复制粘贴命令。这就是为什么您需要
包括