朱莉娅:OOP与否

Yve*_*ves 41 oop struct class julia

我和Julia一起在朱诺工作.

我不知道朱莉娅是否支持OOP.

例如,是否有类似classstructC++的?

如何使用数据或函数等成员声明它?

Dav*_*ers 40

如有疑问,请阅读文档......

https://docs.julialang.org/en/v1/manual/types/#Composite-Types-1

长话短说:

struct MyType
    a::Int64
    b::Float64
end

x = MyType(3, 4)

x.a
Run Code Online (Sandbox Code Playgroud)

编辑:方法在类型定义之外定义,例如

function double(x::MyType)
    x.a *= 2
end
Run Code Online (Sandbox Code Playgroud)

例如,方法不会存在于类型中,就像在C++或Python中一样.这允许Julia的一个关键特性(多重调度)也可以与用户定义的类型一起工作,这些类型与系统定义的类型完全相同.

  • 关键是在Python中你经常会定义x.double(),即对象的双重方法. (3认同)

Chr*_*kas 28

Julia并不是完全意义上的面向对象,因为你无法将方法附加到Julia的对象("类型").这些类型看起来与对象非常相似.但是,由于它们没有自己的关联方法,并且没有继承,因此对象本身不会执行操作.相反,你有作用于对象的功能.

不同的是ball.checkCollision()vs checkCollision(ball,Walls).实际上,这并不是什么大不了的事.你可以通过让一个类型具有另一种类型的字段来创建类似继承的东西,并且多个调度允许你根据你给它们的对象编写执行不同事物的函数,这几乎就像对象方法.真正的区别在于您将函数和类型保存在文件中.所以你可以在Julia中做一种准反对导向的风格,但它仍然与OOP语言截然不同.

  • 是的,您可以从其他包中扩展方法这一事实已成为 Julia 的一个主要功能,它允许使用非常漂亮的技巧。DiffEq/JuMP 的联合包 API 使用它。将对偶数放入微分方程和优化器以进行多级优化正在使用它。与 OOP 相比,这是一个非常好的优势,后者花了几年时间才开发出一种明显有用的风格。鉴于功能的丧失,现在很难回到 OOP。 (2认同)
  • 根据我和他人的经验,发现多种分发机制和设计是可以维护的。我举例说明了Julia的一些“正常工作”行为,这是造成这种情况的原因,还有更多例子,例如,SymEngine.jl类型充当数字,并通过Measurements重载在较大的代码中进行不确定性量化。它确实有优点也有缺点,并且这种工程折衷是好是坏可以在其他地方详细讨论。我们可以私下讨论我们的意见,但是我不确定这是否与答案有关。 (2认同)
  • Julia 有多个 *dispatch*,而不是多重继承。至于打破封装,几乎每个动态类型的 OOP 语言都允许你这样做,它与多分派完全正交。但是,多分派可以让您避免可怕的访问者模式样板,您需要在没有多方法的基于类的 OOP 设置中表示任何非平凡的数学。 (2认同)

Rez*_*lan 11

我想在Julia用户组Julia和面向对象编程中提到这个有价值的对话.
对我来说,Julia不像传统的OO语言,我总是喜欢将Julia视为面向对象语言的面向方法语言,这是因为如果您尝试在Julia中创建封装数据和功能结构,很快你就会陷入麻烦.


小智 6

答案是 Julia 更接近 c 而不是 c++。因此,OOP 在 Julia 中受到限制,只有 c::struct 而不是 c++::class。因此,严格来说,它只是数据封装或数据结构或类型的定制,而不是真正的 OOP 对象。

  • 如果此答案包含一些详细声称与答案相同的参考资料,则该答案会更好。 (2认同)
  • No Julia 使用 Haskell 或 Lisp 等多方法,而不是基于隐式对象 A 进行重载,函数同时在所有参数上重载。它是OOP的泛化,应该有像OOP一样的自动完成方法。 (2认同)