📜  Julia 的类型 |设置 2

📅  最后修改于: 2022-05-13 01:55:11.448000             🧑  作者: Mango

Julia 的类型 |设置 2

先决条件:Julia 中的类型 |设置 1

Julia 中的类型是一组数据元素,用于使程序执行更快且更易于阅读。类型有助于发现错误并使源代码更加清晰。 Julia 使用动态类型系统来编写变量值,但它也接受静态类型定义,以提供指示某些值属于特定类型的优势。默认情况下,Julia 会为无类型的值分配所需的任何类型。

声明的类型

本文的第 1 组中讨论了三种类型。这些都是:

  • 抽象类型
  • 原始类型
  • 复合类型

这三种类型彼此密切相关。这些类型的属性几乎相似:

  • 它们都被明确声明
  • 他们总是用他们的名字来定义
  • 所有三种类型的超类型都被显式声明
  • 它们可能包含一些参数

这些类型都是称为DataType的单一类型的所有实例,因为它们共享上述属性。根据属性,DataType 可以是抽象类型或具体类型。每个具体值都是某个 DataType 的一个实例。如果它是原始的,那么它的大小不为零,没有指定的字段名称,对于复合数据类型,它必须包含字段名称并且可以为空。
例子:
Julia-Types-11

类型联合

使用Union关键字将多个类型作为实例分配给一个值。类型联合是一种特殊类型,它包括作为对象的任何参数类型的所有实例。
其他语言编译器有自己的 union 结构,但在内部,用于决定值的类型,但 Julia 允许程序员创建自己的 Union 参数类型集。这有助于 Julia 生成具有更快执行速度的高效代码,因为在 Union 的帮助下,它必须知道程序员声明的少量类型之间的检查。

例子:

# Declaring Union of types
StringorFloat = Union{AbstractString, AbstractFloat}
  
# Function with argument of Union type
function Geeks(x::StringorFloat)
    println(x)
end
  
# Function call
Geeks("Hello")
Geeks(10.5)
Geeks(10)

Julia-Types-12

在上面的代码中,当函数使用Int类型的参数传递时,编译器会引发错误,因为函数的参数是 Float 和 String 类型的 Union 而不是 Integer。

参数类型

Julia 允许将参数传递给它的类型,从而生成一个全新的类型范围——每个参数值组合一个。
通常,所有被称为 DataType 的声明类型都可以参数化。这种参数化类型的声明对每种可能性都遵循相同的语法。
参数类型分为三种类型:

  • 参数复合类型
  • 参数抽象类型
  • 参数基元类型

参数复合类型

在 Parametric 复合类型中,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:

struct {T}
    Field_name1::T
    Field_name2::T
end

上面给出的是参数复合类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。这些中的每一个都将成为可用的具体类型。
Julia-Types-13

结构名称也可以用作有效的类型对象,即上面创建的每个类型都必须是“Geeks”类型的子类型。
Julia-Types-14

未在参数化类型下声明的所有其他类型都不是子类型。
Julia-Types-15

例子:

# Type declaration for
# Parametric Composite Type
struct Geeks{T}
    x::T
    y::T
end
  
# Checking for Types
Geeks("Hello", "Geeks")
Geeks(10, 20)

Julia-Types-17

参数抽象类型

参数抽象类型的声明方式与抽象类型的声明方式类似。在参数抽象类型中,使用前缀抽象类型,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:

abstract type {T} end

上面给出的是参数抽象类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。
Julia-Types-18

与复合类型一样,每个参数类型都是“极客”类型的子类型。
Julia-Types-19

这些亚型彼此不同,并且不是彼此的亚型:
Julia-Types-20

如果我们创建另一个 Type 声明,然后将其定义为当前 Type 声明的子类型,那么新类型的实例将是现有 Type 的子类型:
Julia-Types-21

参数基元类型

就像复合类型和抽象类型一样,原始类型也可以参数化声明。在参数基元类型中,使用前缀基元类型,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:

# For 32 bit
primitive type {T} 32 end

# For 64 bit
primitive type {T} 64 end

上面给出的是参数抽象类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。
Julia-Types-22

参数基元类型的工作方式与复合类型和抽象类型类似。

类型方法

MethodsDescription
@isdefined()Used to tests whether the specified variable s is defined in the current scope or not.
getfield()Used to extract a named field from the specified value of composite type
isefined()Used to test whether the specified global variable or object field is defined or not
oftype()Used to convert a given type of element y(say) into x(say) type of element
setfield()Used to assign a value x to a named field in value of composite type
typemax()Used to return the highest value representable by the specified numeric DataType
typemin()Used to return the lowest value representable by the specified numeric DataType
typeof()Used to return the concrete type of the specified elements