当前位置:K88软件开发文章中心编程语言非主流编程语言Julia → 文章内容

Julia 类型

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-15 16:28:11

32 Int32 <: Signed bitstype 32 Uint32 <: Unsigned bitstype 64 Int64 <: Signed bitstype 64 Uint64 <: Unsigned bitstype 128 Int128 <: Signed bitstype 128 Uint128 <: Unsigned 声明位类型的通用语法是: bitstype ?bits? ?name? bitstype ?bits? ?name? <: ?supertype? ?bits? 表明类型需要多少空间来存储,?name? 为新类型的名字。目前,位类型的声明的位数只支持 8 的倍数,因此布尔类型也是 8 位的。 Bool, Int8 及 Uint8 类型的声明是完全相同的,都占用了 8 位内存,但它们是互相独立的。 复合类型 复合类型也被称为记录、结构、或者对象。复合类型是变量名域的集合。它是 Julia 中最常用的自定义类型。在 Julia 中,所有的值都是对象,但函数并不与它们所操作的对象绑定。Julia 重载时,根据函数 所有参数的类型,而不仅仅是第一个参数的类型,来选取调用哪个方法(详见 :方法 )。 使用 type 关键字来定义复合类型: julia> type Foo bar baz::Int qux::Float64 end 构建复合类型 Foo 的对象: julia> foo = Foo("Hello, world.", 23, 1.5) Foo("Hello, world.",23,1.5) julia> typeof(foo) Foo (constructor with 2 methods) 当一个类型像函数一样被调用时,它可以被叫做类型构造函数(constructor)。每个类型有两种构造函数是自动被生成的(它们被叫做默认构造函数)。第一种是当传给构造函数的参数和这个类型的字段类型不一一匹配时,构造函数会把它的参数传给 convert 函数,并且转换到这个类型相应的字段类型。第二种是当传给构造函数的每个参数和这个类型的字段类型都一一相同时,构造函数直接生成类型。要自动生成两种默认构造函数的原因是:为了防止用户在声明别的新变量的时候不小心把构造函数给覆盖掉。 由于没有约束 bar 的类型,它可以被赋任意值;但是 baz 必须能被转换为 Int : julia> Foo((), 23.5, 1) ERROR: InexactError() in Foo at no file 你可以用 names 这个函数来获取类型的所有字段。 julia> names(foo) 3-element Array{Symbol,1}: :bar :baz :qux 获取复合对象域的值: julia> foo.bar "Hello, world." julia> foo.baz 23 julia> foo.qux 1.5 修改复合对象域的值: julia> foo.qux = 2 2.0 julia> foo.bar = 1//2 1//2 没有域的复合类型是单态类型,这种类型只能有一个实例: type NoFields end julia> is(NoFields(), NoFields()) true is 函数验证 NoFields 的“两个”实例是否为同一个。有关单态类型,后面会详细讲。 有关复合类型如何实例化,需要 参数化类型和方法这两个背景知识。将在构造函数中详细介绍构造实例。 不可变复合类型 可以使用关键词 immutable 替代 type 来定义 不可变 复合类型: immutable Complex real::Float64 imag::Float64 end 这种类型和其他复合类型类似,除了它们的实例不能被更改。不可变复合类型具有以下几种优势: 它们在一些情况下更高效。像上面 Complex 例子里的类型就被有效地封装到数组里,而且有些时候编译器能够避免完整地分配不可变对象。 不会与类型的构造函数提供的不变量冲突。 用不可变对象的代码不容易被侵入。 一个不可变对象可以包含可变对象,比如数组,域。那些被包含的可变对象仍然保持可变;只有不可变对象自己的域不能变得指向别的对象。 理解不可变复合变量的一个有用的办法是每个实例都是和特定域的值相关联的 - 这些域的值就能告诉你关于这个对象的一切。相反地,一个可变的对象就如同一个小的容器可能包含了各种各样的值,所以它不能从它的域的值确定出这个对象。在决定是否把一个类型定义为不变的时候,先问问是否两个实例包含相同的域的值就被认为是相同,或者它们会独立地改变。如果它们被认为是相同的,那么这个类型就该被定义成不可变的。 再次强调下, Julia 中不可变类型有两个重要的特性: 不可变复合类型的数据在传递时会被拷贝 (在赋值时是这样, 在调用函数时也是这样), 相对的, 可变类型的数据是以引用的方式互相传递. 不可变复合类型内的域不可改变. 对于有着 C/C++ 背景的读者, 需要仔细想下为什么这两个特性是息息相关的。设想下,如果这两个特性是分开的,也就是说,如果数据在传递时是拷贝的, 然而数据内部的变量可以被改变, 那么将很难界定某段代码的实际作用。举个例子,假设 x 是某个函数的参数, 同时假设函数改变了参数中的一个域:x.isprocessed = true。根据 x 是值传递或者引用传递, 在调用完函数是, 原来 x 的值有可能没有改变, 也有可能改变. 为了防止出现这种不确定效应, Julia 限定如果参数是值传递, 其内部域的值不可改变。 被声明类型 以上的三种类型是紧密相关的。它们有相同的特性: 明确地被声明 有名字 有明确的父类 可以有参数 正因有共有的特性,这些类型内在地表达为同一种概念的实例,DataType,是以下类型之一: julia> typeof(Real) DataType julia> typeof(Int) DataType DataType 既可以抽象也可以具体。如果是具体的,它会拥有既定的大小,存储安排和(可选的)名域。所以一个位类型是一个大小非零的 DataType,但没有名域。一个复合类型是一个可能拥有名域也可以为空集(大小为零)的 DataType 。 在这个系统里的每一个具体的值都是某个 DataType 的实例,或者一个多元组。 多元组类型 多元组的类型是类型的多元组: julia> typeof((1,"foo",2.5)) (Int64,ASCIIString,Float64) 类型多元组可以在任何需要类型的地方使用: julia> (1,"foo",2.5) :: (Int64,String,Any) (1,"foo",2.5) julia> (1,"foo",2.5) :: (Int64,String,Float32) ERROR: type: typeassert: expected (Int64,String,Float32), got (Int64,

上一页  [1] [2] [3] [4]  下一页


Julia 类型