如何在 Julia 中引用结构本身

poo*_*oky 4 struct julia

我有这个代码:

struct MyStruct
    text::String
    
    function MyStruct(_text::String)
        text = _text
        # do other things
    end
end
Run Code Online (Sandbox Code Playgroud)

当我写这篇文章时,我意识到 Julia 没有识别textasMyStruct的字段。我怎样才能在 Julia 中像在 Python 中那样做这样的事情?

self.text = _text
Run Code Online (Sandbox Code Playgroud)

phi*_*ler 5

不要试图模仿 Python。Julia 不是面向对象的。

您可以通过以下方式模拟 Python 风格的构造函数

mutable struct MyStruct
    text::String
    
    function MyStruct(text::String)
        self = new()
        self.text = some_stuff(text)
        return self
    end
end
Run Code Online (Sandbox Code Playgroud)

但要使其发挥作用,结构必须是可变的。然后您可以设置一个未初始化实例并new()覆盖这些字段。

__init__请注意,这更相当于和的组合__new__。在 Python 中,该new部分(99% 的时间)已经为您完成,您只需在__init__. 在 Julia 中,你必须自己完成这两件事;这尤其还需要在构造函数末尾返回新值!

说了这么多,这样写通常没什么用。更惯用的说法是

struct MyStruct
    text::String

    MyStruct(text::String) = new(some_stuff(text))
end
Run Code Online (Sandbox Code Playgroud)

除非您绝对需要结构是可变的(这会对内存布局和可能的优化产生影响)。

还要阅读内部构造函数和外部构造函数之间的区别。如果您希望以上是构造 的唯一有效方法MyStruct,那么这很好。如果您想要“方便的构造函数”,例如使用默认参数或从其他类型进行转换,则更喜欢外部构造函数(您没有,new但递归调用构造函数,直到到达内部构造函数)。