julia系列11:struct和类
Posted IE06
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了julia系列11:struct和类相关的知识,希望对你有一定的参考价值。
1. struct:自定义复合数据结构
在系列2中,我们知道了julia中的struct可以封装多个基本数据结构:
2. 用外部函数模拟class
我们可以用将class的函数定义在外部,调用时将实例作为参数传入函数即可,如下例子:
using Classes
@class mutable Fruit begin
x::Int
Fruit() = Fruit(0)
end
function eat(self::AbstractFruit)
println("eating ",self.x)
end
f = Fruit()
f.x = 10
eat(f)
下面是另一个例子,是个initialization的例子:
struct Foo
var1
var2
matrix
end
Foo(a,b) = Foo(a,b,zeros(a,b))
initialization也可以使用new函数,放在struct内部。有三种方式,第一种是new并放在前面(可变参数)
struct Foo
var1
var2
matrix
Foo(a,b,m=zeros(a,b)) = new(a,b,m)
end
第二种是new并放在后面(重载)
struct Foo
var1
var2
matrix
Foo(a,b) = new(a,b,zeros(a,b))
end
第三种是使用@kwdef
julia> Base.@kwdef mutable struct Test
a
b
c = 3
end
julia> t = Test(a=1, b=2)
Test(1, 2, 3)
3. 使用class库
参考https://juliahub.com/ui/Packages/Classes/FemUz/1.4.0
using Classes
@class Foo begin # or, equivalently, @class Foo <: Class begin ... end
foo::Int
end
@class mutable Bar <: Foo begin
bar::Int
end
调用例子如下:
# Custom constructors defined inside the @class above
Foo()
Foo(self::AbstractFoo)
#
# Methods emitted by @class macro for Foo
#
# all-fields constructor
Foo(foo::Int64)
# local-field initializer
Foo(self::T, foo::Int64) where T<:AbstractFoo
# Custom constructor defined inside the @class above
Bar()
# Custom initializer defined inside the @class above
Bar(self::UnionNothing, AbstractBar)
#
# Methods emitted by @class macro for Bar
#
# all-fields constructor
Bar(foo::Int64, bar::Int64)
# local-fields initializer
Bar(self::T, bar::Int64) where T<:AbstractBar
# all fields initializer
Bar(self::T, foo::Int64, bar::Int64) where T<:AbstractBar
# Superclass-copy initializer
Bar(bar::Int64, s::Foo)
以上是关于julia系列11:struct和类的主要内容,如果未能解决你的问题,请参考以下文章