Skip to content

结构体 ​

声明 ​

结构体用 jiegouti(结构体 / struct)声明,每个字段都必须写类型,可以带默认值:

cpro
jiegouti Person {
    name  leixing zifuchuan : "无名",  // 默认值 "无名"
    age   leixing z64    : 18,         // 默认值 18
    money leixing z32,                 // 没有默认值
}
cpro
结构体 Person {
    name  类型 string : "无名",    // 默认值 "无名"
    age   类型 i64    : 18,        // 默认值 18
    money 类型 i32,                // 没有默认值
}
cpro
struct Person {
    name  type string : "无名",    // 默认值 "无名"
    age   type i64    : 18,        // 默认值 18
    money type i32,                // 没有默认值
}

创建实例 ​

创建时所有字段都必须有值:没有默认值的字段必须给出。

cpro
bl a leixing Person = { name: "张三", age: 20, money: 15 }
bl b leixing Person = { money: 17 }     // ✓ name、age 用默认值
bl c leixing Person = { age: 20 }       // ✗ money 没有值
cpro
变量 a 类型 Person = { name: "张三", age: 20, money: 15 }
变量 b 类型 Person = { money: 17 }      // ✓ name、age 用默认值
变量 c 类型 Person = { age: 20 }        // ✗ money 没有值
cpro
var a type Person = { name: "张三", age: 20, money: 15 }
var b type Person = { money: 17 }       // ✓ name、age 用默认值
var c type Person = { age: 20 }         // ✗ money 没有值

字面量前面不写类型名。函数返回结构体时也一样:

cpro
jiegouti Vec {
    x leixing z64,
    y leixing z64,
}

hs make(a z64, b z64) Vec {
    fanhui { x: a, y: b }
}
cpro
结构体 Vec {
    x 类型 i64,
    y 类型 i64,
}

函数 make(a i64, b i64) Vec {
    返回 { x: a, y: b }
}
cpro
struct Vec {
    x type i64,
    y type i64,
}

fn make(a i64, b i64) Vec {
    return { x: a, y: b }
}

读写字段用 .:

cpro
a.age = 21
dayin(a.name, a.age)
cpro
a.age = 21
打印(a.name, a.age)
cpro
a.age = 21
print(a.name, a.age)

每个实例都是独立的副本,var b = a 得到一份拷贝,改 b 不影响 a。

方法 ​

用 shixian(实现 / impl)给结构体定义方法。冒号后面的名字(下例的 p)在方法里代表调用方法的那个实例:

cpro
jiegouti Person {
    name leixing zifuchuan,
    age  leixing z64,
}

shixian Person:p {
    hs set_age(v z64) kongbai {
        p.age = v
    }

    hs older(n z64) z64 {
        fanhui p.age + n
    }
}

rukou() {
    bl b leixing Person = { name: "张三", age: 18 }
    b.set_age(30)
    dayin(b.age)            // 30
    dayin(b.older(7))       // 37
}
cpro
结构体 Person {
    name 类型 string,
    age  类型 i64,
}

实现 Person:p {
    函数 set_age(v i64) void {
        p.age = v
    }

    函数 older(n i64) i64 {
        返回 p.age + n
    }
}

入口() {
    变量 b 类型 Person = { name: "张三", age: 18 }
    b.set_age(30)
    打印(b.age)             // 30
    打印(b.older(7))        // 37
}
cpro
struct Person {
    name type string,
    age  type i64,
}

impl Person:p {
    fn set_age(v i64) void {
        p.age = v
    }

    fn older(n i64) i64 {
        return p.age + n
    }
}

rukou() {
    var b type Person = { name: "张三", age: 18 }
    b.set_age(30)
    print(b.age)            // 30
    print(b.older(7))       // 37
}
  • p 是实例本身,不是拷贝:方法里改字段,改的就是调用方的实例
  • p 只能读写字段,不能整体赋值(p = other 报错)
  • 方法的返回类型同样不能省略
  • 不同结构体的方法可以同名,也可以和普通函数同名

谁能调用方法 ​

调用者必须是变量、结构体字段或数组元素,不能是临时值:

cpro
b.set_age(30)             // ✓ 变量
box.owner.set_age(30)     // ✓ 结构体字段
arr[i].set_age(30)        // ✓ 数组元素
make().set_age(30)        // ✗ 不能在临时值上调用方法
cpro
b.set_age(30)             // ✓ 变量
box.owner.set_age(30)     // ✓ 结构体字段
arr[i].set_age(30)        // ✓ 数组元素
make().set_age(30)        // ✗ 不能在临时值上调用方法
cpro
b.set_age(30)             // ✓ 变量
box.owner.set_age(30)     // ✓ 结构体字段
arr[i].set_age(30)        // ✓ 数组元素
make().set_age(30)        // ✗ 不能在临时值上调用方法

只读变量不能调用方法(方法可能修改它),但可以读字段:

cpro
bl({ readonly: zheng }) c leixing Person = { name: "x", age: 1 }
c.set_age(9)        // ✗ 只读变量不能调用方法
dayin(c.age)        // ✓
cpro
变量({ readonly: 真 }) c 类型 Person = { name: "x", age: 1 }
c.set_age(9)        // ✗ 只读变量不能调用方法
打印(c.age)         // ✓
cpro
var({ readonly: true }) c type Person = { name: "x", age: 1 }
c.set_age(9)        // ✗ 只读变量不能调用方法
print(c.age)        // ✓

匿名结构体 ​

不需要复用的结构可以直接写成匿名结构体,冒号后面是值:

cpro
bl a = {
    age  leixing z64    : 18,
    name leixing zifuchuan : "张三",
}
dayin(a.name)
cpro
变量 a = {
    age  类型 i64    : 18,
    name 类型 string : "张三",
}
打印(a.name)
cpro
var a = {
    age  type i64    : 18,
    name type string : "张三",
}
print(a.name)

匿名结构体不能定义方法。

不可拷贝结构体 ​

包住文件句柄、网络连接这类资源的结构体,可以声明为不可拷贝,见 nocopy 结构体。

cpro 目前处于测试阶段