我有这个代码:
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)
不要试图模仿 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但递归调用构造函数,直到到达内部构造函数)。