我想在Julia中使用一个对象,它可以通过函数初始化。它就像C中的函数指针一样。
这是我的目标:
我有一个julia脚本和一个julia模块。
在这个脚本中,我有一个数组
模块需要能够在这个数组中添加一些元素。
xxx
基本上,我的想法是:
在模块中,我们无法做任何事情但#script
liste = Int64[]
function addElement(e)
liste.push(e)
end
include("path/mymodule.jl")
myModule.setAddElementFunc(addElement)
myModule.execute() # error: wrong number of parameter
#mymodule.jl
module myModule
export setAddElementFunc
export execute
addElementFunc = ()->()
funciton setAddElementFunc(fn)
addElementFunc = fn
end
function execute()
addElementFunc(3)
end
end
。我需要做这样的结构,因为我的工作是编写julia脚本,其他人会对模块进行编码。所以我想限制他保持听众安全的权利,在这种情况下,他可以添加元素。
答案 0 :(得分:3)
要在Julia中生成新类型,我们可以执行类似
的操作type MyArray{T}
elements::Vector{T}
my_value::Int
end
这会自动为您生成几个默认构造函数。 您可以通过为其每个字段提供初始值来创建您的类型的对象。
v = MyArray([3, 5], 17)
在Julia中,函数不存在于对象内部,而是在对象外部定义的方法。从这个意义上说,Julia中的对象类似于C中的结构,除了它们可以(并且通常应该)按类型进行参数化,如本例所示({T}
)。
在这种情况下,例如,您可以简单地从基础Julia定义自己的泛型函数push!
方法,以对新类型的对象进行操作:
push!(x::MyArray, value) = push!(x.elements, value)
现在你可以做到
push!(v, 4)
将值4添加到对象中。
您应该阅读Julia手册并查看一些教程,以获取有关定义类型的更多信息。如果有任何不清楚的地方,请告诉我们。
答案 1 :(得分:1)
目前还不完全清楚你想做什么。 一种可能性如下:
function getAddMsgFunc(fn)
fn # just return the function that is passed in
end
function my_show()
println("xxxxx")
end
addMsgFunc = getAddMsgFunc(my_show)
addMsgFunc()
函数是Julia中的第一类对象,这意味着您可以按名称传递它们。
答案 2 :(得分:1)
虽然@David是正确的,但我想指出global
关键字的用处。我喜欢在Julia-Lang中将其视为此处作为CPP this
相似的关键字。
module test
addMsgFunc=()->()
function getAddMsgFunc(fn)
global addMsgFunc = fn
end
function show()
println("xxxxx")
end
end
julia> addMsgFunc
ERROR: UndefVarError: addMsgFunc not defined
julia> test.addMsgFunc();
julia> test.getAddMsgFunc(test.show);
julia> test.addMsgFunc()
xxxxx
julia> addMsgFunc # Its in global but in another scope
ERROR: UndefVarError: addMsgFunc not defined
julia> test.addMsgFunc=()->() # You cant assign to it normally
ERROR: cannot assign variables in other modules
答案 3 :(得分:0)
“函数指针”只是一个复杂的C结构,这是必要的,因为没有其他方法可以使用不同的名称来引用函数。
在Julia中,你只是创建另一个引用同一个函数对象的名称,就像我在第一个答案中所做的那样,例如。
hello() = "hi"
goodbye() = "ciao"
f = hello # f is a "function pointer"
f()
f = goodbye
f()
您可以轻松地将函数放在其他数据结构中,例如字典:
greeting = Dict("hello" => hello, "goodbye" => goodbye)
f = greeting["hello"]
f()