Julia 的类型 |设置 2
先决条件:Julia 中的类型 |设置 1
Julia 中的类型是一组数据元素,用于使程序执行更快且更易于阅读。类型有助于发现错误并使源代码更加清晰。 Julia 使用动态类型系统来编写变量值,但它也接受静态类型定义,以提供指示某些值属于特定类型的优势。默认情况下,Julia 会为无类型的值分配所需的任何类型。
声明的类型
本文的第 1 组中讨论了三种类型。这些都是:
- 抽象类型
- 原始类型
- 复合类型
这三种类型彼此密切相关。这些类型的属性几乎相似:
- 它们都被明确声明
- 他们总是用他们的名字来定义
- 所有三种类型的超类型都被显式声明
- 它们可能包含一些参数
这些类型都是称为DataType的单一类型的所有实例,因为它们共享上述属性。根据属性,DataType 可以是抽象类型或具体类型。每个具体值都是某个 DataType 的一个实例。如果它是原始的,那么它的大小不为零,没有指定的字段名称,对于复合数据类型,它必须包含字段名称并且可以为空。
例子:
类型联合
使用“ 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)
在上面的代码中,当函数使用Int
类型的参数传递时,编译器会引发错误,因为函数的参数是 Float 和 String 类型的 Union 而不是 Integer。
参数类型
Julia 允许将参数传递给它的类型,从而生成一个全新的类型范围——每个参数值组合一个。
通常,所有被称为 DataType 的声明类型都可以参数化。这种参数化类型的声明对每种可能性都遵循相同的语法。
参数类型分为三种类型:
- 参数复合类型
- 参数抽象类型
- 参数基元类型
参数复合类型
在 Parametric 复合类型中,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:
struct {T}
Field_name1::T
Field_name2::T
end
上面给出的是参数复合类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。这些中的每一个都将成为可用的具体类型。
结构名称也可以用作有效的类型对象,即上面创建的每个类型都必须是“Geeks”类型的子类型。
未在参数化类型下声明的所有其他类型都不是子类型。
例子:
# Type declaration for
# Parametric Composite Type
struct Geeks{T}
x::T
y::T
end
# Checking for Types
Geeks("Hello", "Geeks")
Geeks(10, 20)
参数抽象类型
参数抽象类型的声明方式与抽象类型的声明方式类似。在参数抽象类型中,使用前缀抽象类型,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:
abstract type {T} end
上面给出的是参数抽象类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。
与复合类型一样,每个参数类型都是“极客”类型的子类型。
这些亚型彼此不同,并且不是彼此的亚型:
如果我们创建另一个 Type 声明,然后将其定义为当前 Type 声明的子类型,那么新类型的实例将是现有 Type 的子类型:
参数基元类型
就像复合类型和抽象类型一样,原始类型也可以参数化声明。在参数基元类型中,使用前缀基元类型,参数紧跟在花括号内的类型名称之后。这里的参数是一般类型 {T},其中 T 可以是任何类型。
句法:
# For 32 bit
primitive type {T} 32 end
# For 64 bit
primitive type {T} 64 end
上面给出的是参数抽象类型的一般语法。在这里,T 可以替换为任何具体类型,如 Int64、Float64、AbstractString 等。
参数基元类型的工作方式与复合类型和抽象类型类似。
类型方法
Methods | Description |
---|---|
@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 |