Function 调用用户定义函数的Julia模块

Function 调用用户定义函数的Julia模块,function,methods,julia,Function,Methods,Julia,我有一个模块,它为我想要执行的模拟建立了一些抽象层次。假设最低的抽象级别是一个节点(如果我们在两个抽象级别截断它,我们将其构建到系统中),它是我在模块中定义的抽象类型的子类型。节点将使用用户定义的更新更新函数 我希望用户能够定义一个新的节点和更新功能,但更新函数应该可以从模块的系统更新中调用函数。下面提供了一个示例: module test_pack abstract type Node end struct System{N<:Node} nodes::Array{N,1} e

我有一个模块,它为我想要执行的模拟建立了一些抽象层次。假设最低的抽象级别是一个
节点
(如果我们在两个抽象级别截断它,我们将其构建到
系统
中),它是我在模块中定义的抽象类型的子类型。
节点将使用用户定义的
更新更新函数

我希望用户能够定义一个新的
节点
更新功能,但
更新函数应该可以从模块的
系统更新中调用函数。下面提供了一个示例:

module test_pack
abstract type Node end

struct System{N<:Node}
    nodes::Array{N,1}
end

function system_update!(s::System)
   update!.(s.nodes) 
end

export Node, System, system_update!
end


# import module
using Main.test_pack


# User-defined types and functions
mutable struct My_Node<:Node
    state
end
function update!(n::My_Node)
   n.state *= 2 
end


# Define system of user defined nodes
sys = System([My_Node(1), My_Node(2)])

# Run the system
system_update!(sys)
模块测试包
抽象类型节点端

struct System{N您想要做的事情的一种方法是设置
update!
函数是由模块定义的,定义
My_节点
类型(源自
节点
)的代码也定义了对
update!
函数的特定扩展

这里,由于对抽象类型的参数
节点
没有默认的
update!
实现,因此可以定义一个只将函数标记为“属于”模块,而不提供任何实现。
TestPack.update!(::My_Node)
方法的实现显式扩展了这个函数,通过一个完全限定的名称引用它

module TestPack
abstract type Node end

struct System{N<:Node}
    nodes::Array{N,1}
end

function update! end

function system_update!(s::System)
    update!.(s.nodes)
end

export Node, System, system_update!
end


# import module
using .TestPack


# User-defined types and functions
mutable struct My_Node<:Node
    state
end

function TestPack.update!(n::My_Node)
    n.state *= 2
end


sys = System([My_Node(1), My_Node(2)])

# Run the system
system_update!(sys)

另外,请注意,在Julia中,使用CamelCase符号作为模块名称是一种习惯;在上面的示例中,我将您的模块重命名为
TestPack
,如下所示


该模块也可以被称为
使用.TestPack
而不是
使用Main.TestPack
;这被称为a.

感谢您的帮助,这很有意义,并解决了这个问题。我也很感谢您对文体惯例的旁白。对于
状态
,请避免使用
任何
类型。如果您事先不知道类型使用参数化类型。
julia> sys
System{My_Node}(My_Node[My_Node(2), My_Node(4)])