朱莉娅:不是的OOP

问题描述 投票:31回答:6

我和Julia一起在朱诺工作。

我不知道Julia是否支持OOP。

例如,有什么类似c ++的classstruct

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

class oop struct julia
6个回答
38
投票

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

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

长话短说:

struct MyType
    a::Int64
    b::Float64
end

x = MyType(3, 4)

x.a

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

function double(x::MyType)
    x.a *= 2
end

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


28
投票

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

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


11
投票

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


3
投票

是。它不能从具体的“类”继承,只能从抽象的类继承。

具有多个调度的函数是对单个调度的方法的严格推广,并且严格地更加多态。您只需在类定义之外定义它们,因为它们可以“属于”多个对象。

OO语言中的传统方法是Julia函数的一个特例,您只能根据第一个参数进行调度。


2
投票

我不是语言方面的专家,但我的理解是:是......不。

它具有类和结构的等价物,但是除了单个构造函数之外,这些对象上没有方法。

在主流的面向对象语言中,例如C ++,Java,Python和Ruby,复合类型也具有与它们相关联的命名函数,并且该组合称为“对象”。在纯粹的面向对象语言中,例如Python和Ruby,所有值都是对象,无论它们是否为复合。在不太纯的面向对象语言(包括C ++和Java)中,某些值(如整数和浮点值)不是对象,而用户定义的复合类型的实例是具有关联方法的真实对象。在Julia中,所有值都是对象,但函数不与它们操作的对象捆绑在一起。这是必要的,因为Julia选择了多个调度使用函数的哪个方法,这意味着在选择方法时考虑所有函数参数的类型,而不仅仅是第一个(请参阅方法以获取有关方法和调度的更多信息) )。因此,功能仅仅属于他们的第一个参数是不合适的。将方法组织到函数对象中而不是在每个对象“内部”命名方法包最终成为语言设计的一个非常有益的方面。


2
投票

答案是朱莉娅更接近于c而不是c ++。因此,在Julia中OOP仅限于c :: struct而不是c ++ :: class。因此,严格意义上讲,它只是数据封装或数据结构或类型的自定义,而不是真正的OOP对象。

© www.soinside.com 2019 - 2024. All rights reserved.