我正在尝试学习Julia,正在读一本书,该书在有关复合类型的章节中显示了以下两个代码示例:
1。
type Points
x::Int64
y::Int64
z::Int64
end
2。
struct Point
x::Int
y::Int
z::Int
end
但是,这本书没有说明何时使用struct
和何时使用type
。
有什么区别?
答案 0 :(得分:6)
这在您的资料来源中相当混乱,因为它混合了语言历史中不兼容时代的不同含义。
type
或immutable
声明,其中type
用于可变类型(还有bitstype
(现在称为“原始类型”)。mutable struct
和struct
(以及与此一致的primitive type
和abstract type
)。因此,基本上名称已更改,以便所有定义类型的方式都变得更加一致,并且不可变的结构已成为“未标记”的情况。
在此上下文中,“可变”表示您不能重新分配一个字段(p.x = 3
)。这并不意味着字段的内容不能更改,它们恰好是可变的(如果something.v[1] = 2
是不可变的类型,something
也将起作用。)
答案 1 :(得分:1)
如@phipsgabler所述,您正在混合来自不同版本的Julia的代码。
关于这个特定主题,您还可以查看我的“ Julia简洁教程”,主题为“ {Custom Structures”。
“ Julia Quick Syntax reference”一书(Apress,2019年)中提供了相同的扩展主题,我从中报告了未经编辑的来源中的一个例外(仍然充满英语错误,但您一定会明白这一点)。 ):
在第2章“数据类型和结构”中,我们讨论了内置类型,包括容器。在本章中,我们将介绍如何创建用户定义的类型。
让我们清楚这两个术语及其在Julia语言环境中的含义。
与普通英语一样,作为对象的 type 是指可以描述对象的一组特征。例如,可以使用尺寸,重量,颜色描述 sheet 类型的对象。
Julia中的所有值都是属于给定类型的真实对象(它们是给定类型的各个“实例”)。
Julia类型包括所谓的原始类型,它们仅由固定数量的位组成(就像所有数字类型一样。.Int64
,Float64
,还有{{1} } ..)和复合类型或结构,其中对象的特征集通过多个字段和可变位数来描述。
结构和原始类型都可以由用户定义并按层次组织。结构大致对应于其他语言中已知的 class 。
使用关键字Char
定义了用户定义的原始类型,并且仅定义了其名称和所需的位数:
primitive type
例如:
primitive type [name] [bits] end
重要提示:Julia的(当前)限制是位数必须是8388608以下的8的倍数。
可以选择指定父类型:
primitive type My10KBBuffer 81920 end
请注意,具有相同位数的两个用户定义类型的内部表示形式完全相同。唯一会改变的是它们的名称,但这是一个重要的区别:这是当将这些类型的给定对象作为更改的参数传递时,函数定义为起作用的方式,即,命名类型的程序在整个程序中的用法可以区分它们而不是它们的实现。
以与原始类型类似的方式,要定义结构,我们使用关键字primitive type [name] <: [supertype] [bits] end
,为结构命名,指定字段,并使用关键字mutable struct
结束定义:>
end
请注意,尽管您可以选择将每个单独的字段定义为给定类型(例如field3 :: Int64),但不能将字段定义为给定类型的子类型(例如mutable struct MyOwnType
field1
field2::String
field3::Int64
end
)。为此,您可以在结构定义中使用模板:
field3<:Number
使用模板,第一次构造其field3类型为mutable struct MyOwnType{T<:Number}
field1
field2::String
field3::T
end
的对象时,动态创建结构的定义。
用于注释各个字段的类型可以是原始类型(如上例),也可以是对其他结构的引用(请参阅后面的示例)。 +
还请注意,与其他高级语言(例如Python)不同,您在首次定义结构后就无法在该结构中添加或删除字段。如果需要此功能,请改用<>,但请注意,您将在此灵活性与较差的性能之间进行权衡。
相反,要获得性能(但又要以灵活性为代价),可以省略T
前面的mutable
关键字。
这将约束一旦创建了该类型的对象,就不能再更改其字段(即,默认情况下结构是不可变的)。
请注意,可变对象(作为数组)在可变结构中也保持可变。