仓颉—自定义类型

内容纲要

record 类型

record是一种自定义类型,可以将若干不同类型的值组合在一起,成为一个新类型。下面依次介绍如何定义record类型,如何创建record实例,以及record中的mut函数。

定义 record 类型

record类型的定义以关键字record开头,后跟record的名字,接着是定义在一对花括号中的record定义体。record定义体中可以定义一系列的成员变量、成员属性、构造函数和成员函数。

record Rectangle
{
    let width: Int64
    let height: Int64

    public init(width: Int64, height: Int64)
    {
        this.width = width
        this.height = height
    }

    public func area()
    {
        width * height
    }
}

定义了名为Rectanglerecord类型,它有两个Int64类型的成员变量widthheight,一个有两个Int64类型参数的构造函数(使用关键字init定义,函数体中通常是对成员变量的初始化),以及一个成员函数area(返回widthheight的乘积)。

注:record只能定义在源文件顶层,不能在record、函数、class等可以引入新作用域的位置处定义record

record 成员变量

record成员变量分为实例成员变量和静态成员变量(使用static修饰符,且必须有初值),二者的区别在于实例成员变量只能通过record实例(aT类型的实例,指的是a是一个T类型的值)访问,静态成员变量只能通过record类型名访问。

实例成员变量定义时可以不设置初值(但必须标注类型,如上例中的widthheight),也可以设置初值:

record Rectangle
{
    let width = 10
    let height = 20
}

record 构造函数

record支持两类构造函数:普通构造函数和主构造函数。

普通构造函数以关键字init开头,后跟参数列表和函数体,函数体中必须完成对所有未初始化的实例成员变量的初始化(如果参数名和成员变量名无法区分,可以在成员变量前使用this加以区分,this表示record的当前实例),否则编译报错。

record Rectangle
{
    let width: Int64
    let height: Int64

    public init(width: Int64, height: Int64)
    {   // Error: 'height' is not initialized in the constructor
        this.width = width
    }
}

一个record中可以定义多个普通构造函数,但它们必须构成重载,否则报重定义错误。

record Rectangle
{
    let width: Int64
    let height: Int64

    public init(width: Int64)
    {
        this.width = width
        this.height = width
    }

    public init(width: Int64, height: Int64)
    {
        this.width = width
        this.height = height
    }

    public init(height: Int64)
    {
        this.width = height
        this.height = height
    }
}

除了可以定义若干普通的以init为名字的构造函数外,record内还可以定义(最多)一个主构造函数。主构造函数的名字和record类型名相同,它的参数列表中可以有两种形式的形参:普通形参和成员变量形参(需要在参数名前加上letvar),成员变量形参同时扮演定义成员变量和构造构造函数的功能。

使用主构造函数通常可以简化record的定义,例如,上述包含一个init构造函数的Rectangle可以简化为如下定义:

record Rectangle
{
    public Rectangle(let width: Int64, let height: Int64) {}
}

主构造函数的参数列表中也可以定义普通形参:

record Rectangle
{
    public Rectangle(name: String, let width: Int64, let height: Int64) {}
}

留下评论

您的电子邮箱地址不会被公开。