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)])