朱莉娅:一个功能对象

时间:2015-11-13 16:56:00

标签: function julia

我想在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脚本,其他人会对模块进行编码。所以我想限制他保持听众安全的权利,在这种情况下,他可以添加元素。

4 个答案:

答案 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()