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和类的主要内容,如果未能解决你的问题,请参考以下文章

julia系列10:apple m1 gpu编程

julia系列10:apple m1 gpu编程

julia系列10:apple m1 gpu编程

julia系列1:介绍与安装

julia系列1:介绍与安装

julia系列2:数据结构