Zig 结构体和枚举

简介: Zig 结构体和枚举

在 Zig 编程语言中,结构体(struct)和枚举(enum)是两种基本的数据类型。

结构体和枚举是定义和使用自定义数据类型的两种主要方式。

结构体和枚举提供了更高层次的数据组织和类型安全,适用于不同的编程场景。

结构体(Struct):用于将相关变量组合成一个复合数据类型。结构体可以包含字段和方法,适用于组织复杂的数据。
枚举(Enum):用于定义一组命名的常量,可以是无值或带值的枚举。枚举适用于表示有限的离散值。
结构体(Struct)
结构体是一种复合数据类型,它允许将多个不同类型的数据项组合成一个单一的类型。

Zig 中结构体的语法如下:

const structName = struct {
field1: FieldType1,
field2: FieldType2,
// 其他字段
};
以下代码中,MyStruct 是一个结构体类型,它有三个字段:field1 是一个 32 位整数,field2 是一个双精度浮点数,field3 是一个指向字节数组的指针。

struct MyStruct {
field1: i32,
field2: f64,
field3: []const u8,
}
实例
const std = @import("std");

// 定义一个结构体
const Person = struct {
name: []const u8,
age: u32,
};

pub fn main() void {
// 创建结构体实例
const person = Person{
.name = "Alice",
.age = 30,
};

// 访问结构体字段并正确格式化
std.debug.print("Name: {s}\n", .{person.name}); // 使用 {s} 格式化切片
std.debug.print("Age: {}\n", .{person.age});

}
编译执行以上代码,输出结果为:

Name: Alice
Age: 30
要修改结构体中的字段,确保你使用 var 来定义结构体实例,以便能够修改字段值。如果你使用 const 定义结构体实例,则不能修改其字段值。

实例
const std = @import("std");

// 定义一个结构体
const Person = struct {
name: []const u8,
age: u32,
};

pub fn main() void {
// 创建结构体实例
var person = Person{
.name = "Alice",
.age = 30,
};

// 输出初始值
std.debug.print("Initial Name: {s}\n", .{person.name});
std.debug.print("Initial Age: {}\n", .{person.age});

// 修改结构体字段的值
person.name = "Bob";
person.age = 35;

// 输出修改后的值
std.debug.print("Modified Name: {s}\n", .{person.name});
std.debug.print("Modified Age: {}\n", .{person.age});

}
编译执行以上代码,输出结果为:

Initial Name: Alice
Initial Age: 30
Modified Name: Bob
Modified Age: 35
方法
在 Zig 中,结构体方法通过 fn 关键字定义,类似于其他编程语言中的类方法。

实例
const std = @import("std");

const Rectangle = struct {
width: u32,
height: u32,

// 计算面积的方法
fn area(self: Rectangle) u32 {
    return self.width * self.height;
}

};

pub fn main() void {
var rect = Rectangle{
.width = 10,
.height = 5,
};

// 调用结构体方法
std.debug.print("Area: {}\n", .{rect.area()});

}
编译执行以上代码,输出结果为:

Area: 50
枚举(Enum)
枚举是一种数据类型,它由一组固定的常量值组成。

Zig 中枚举的语法如下:

const enumName = enum {
Variant1,
Variant2,
// 其他变体
};
以下代码中,MyEnum 是一个枚举类型,它有三个可能的值:Option1、Option2 和 Option3。

enum MyEnum {
Option1,
Option2,
Option3,
}
实例
const std = @import("std");

// 定义一个枚举
const Color = enum {
Red,
Green,
Blue,
};

pub fn main() void {
// 使用枚举
const favoriteColor = Color.Green;

switch (favoriteColor) {
    Color.Red => std.debug.print("Red\n", .{}),
    Color.Green => std.debug.print("Green\n", .{}),
    Color.Blue => std.debug.print("Blue\n", .{}),
}

}
编译执行以上代码,输出结果为:

Green
带值的枚举
Zig 允许为枚举的每个变体指定具体的值,这可以用来表示更多的信息或进行比较。

实例
const std = @import("std");

// 定义一个带值的枚举
const Status = enum(u32) {
Pending = 1,
InProgress = 2,
Completed = 3,
};

pub fn main() void {
const taskStatus = Status.InProgress;

switch (taskStatus) {
    Status.Pending => std.debug.print("Pending\n", .{}),
    Status.InProgress => std.debug.print("InProgress\n", .{}),
    Status.Completed => std.debug.print("Completed\n", .{}),
}

}
编译执行以上代码,输出结果为:

InProgress
使用枚举作为字段
枚举可以用作结构体字段,使得结构体更加灵活和功能强大。

实例
const std = @import("std");

const Status = enum {
Active,
Inactive,
Suspended,
};

const User = struct {
name: []const u8,
status: Status,
};

pub fn main() void {
// 创建 User 实例
const user = User{
.name = "Alice",
.status = Status.Active,
};

// 输出 User 的 name 字段
std.debug.print("User: {s}\n", .{user.name}); // 使用 {s} 格式化切片

// 使用 switch 语句根据 status 输出不同的状态
switch (user.status) {
    Status.Active => std.debug.print("Status: Active\n", .{}),
    Status.Inactive => std.debug.print("Status: Inactive\n", .{}),
    Status.Suspended => std.debug.print("Status: Suspended\n", .{}),
}

}
编译执行以上代码,输出结果为:

User: Alice
Status: Active

目录
相关文章
|
编译器 Linux C语言
C语言的自定义类型:结构体,枚举,联合
C语言的自定义类型:结构体,枚举,联合
43 0
|
编译器 Linux C语言
【C语言】自定义类型:结构体(内存对齐),枚举,联合
【C语言】自定义类型:结构体(内存对齐),枚举,联合
|
编译器 C语言
C语言自定义类型 — 结构体、位段、枚举、联合
本期主要对通讯录三篇博客文章进行补充 通讯录文章:通讯录系列文章 对结构体进行详细介绍,其次讲解位段、枚举、联合体
103 0
|
7月前
|
存储 编译器 Linux
【C语言】自定义类型(结构体+枚举+联合)
【C语言】自定义类型(结构体+枚举+联合)
|
7月前
|
存储 开发框架 编译器
C语言进阶—自定义类型:结构体,枚举,联合
C语言进阶—自定义类型:结构体,枚举,联合
|
存储 编译器 C语言
C语言进阶-自定义类型:结构体、枚举、联合(2)
C语言进阶-自定义类型:结构体、枚举、联合
72 0
|
存储 编译器 Linux
C语言进阶-自定义类型:结构体、枚举、联合(1)
C语言进阶-自定义类型:结构体、枚举、联合
81 0
|
编译器 C语言
C语言进阶,第4节-自定义类型详解(结构体+枚举+联合)
C语言进阶,第4节-自定义类型详解(结构体+枚举+联合)
|
编译器 Linux C语言
C语言进阶-自定义类型:结构体、枚举、联合(上)
C语言进阶-自定义类型:结构体、枚举、联合(上)
71 0
|
存储 开发框架 .NET
【C语言】自定义类型:结构体、枚举、联合(下)
【C语言】自定义类型:结构体、枚举、联合(下)
83 0