Carbon高级特性 #
一、高级模式匹配 #
1.1 模式匹配回顾 #
carbon
var value: i32 = 42;
match (value) {
case 0 => Print("零");
case 1..10 => Print("个位数");
case 10..100 => Print("两位数");
default => Print("大数");
}
1.2 结构体模式 #
carbon
struct Point {
var x: f64;
var y: f64;
}
var p: Point = Point(x = 3.0, y = 4.0);
match (p) {
case Point(x = 0.0, y = 0.0) => Print("原点");
case Point(x = 0.0, y) => Print("Y轴上: {0}", y);
case Point(x, y = 0.0) => Print("X轴上: {0}", x);
case Point(x, y) => Print("坐标: ({0}, {1})", x, y);
}
1.3 嵌套模式 #
carbon
struct Line {
var start: Point;
var end: Point;
}
var line: Line = Line(
start = Point(x = 0.0, y = 0.0),
end = Point(x = 3.0, y = 4.0)
);
match (line) {
case Line(start = Point(x = 0.0, y = 0.0), end) => Print("从原点到 ({0}, {1})", end.x, end.y);
case Line(start, end) if start.x == end.x => Print("垂直线");
case Line(start, end) if start.y == end.y => Print("水平线");
default => Print("普通线段");
}
1.4 数组模式 #
carbon
var arr: [i32; 5] = (1, 2, 3, 4, 5);
match (arr) {
case () => Print("空数组");
case (x) => Print("单元素: {0}", x);
case (x, y) => Print("两元素: {0}, {1}", x, y);
case (first, ...rest) => Print("首元素: {0}, 其余: {1}", first, rest);
}
1.5 枚举模式 #
carbon
enum Result[T, E] {
Ok(T),
Err(E)
}
var result: Result[i32, String] = Ok(42);
match (result) {
case Ok(value) => Print("成功: {0}", value);
case Err(error) => Print("错误: {0}", error);
}
二、Option类型 #
2.1 Option定义 #
carbon
enum Optional[T] {
Some(T),
None
}
2.2 使用Option #
carbon
fn FindUser(id: i32) -> Optional(User) {
if (id == 1) {
return Some(User(name = "Alice"));
}
return None;
}
match (FindUser(1)) {
case Some(user) => Print("找到: {0}", user.name);
case None => Print("未找到");
}
2.3 Option方法 #
carbon
var opt: Optional(i32) = Some(42);
// 检查是否有值
if (opt.HasValue()) {
Print("{0}", opt.Value());
}
// 获取值或默认值
var value: i32 = opt.ValueOr(0);
// 转换
var doubled: Optional(i32) = opt.Map(fn (x: i32) -> i32 { return x * 2; });
// 链式调用
var result: Optional(String) = FindUser(1)
.Map(fn (u: User) -> String { return u.name; })
.Map(fn (n: String) -> String { return n.ToUpper(); });
2.4 Option组合 #
carbon
fn Divide(a: i32, b: i32) -> Optional(i32) {
if (b == 0) {
return None;
}
return Some(a / b);
}
// 链式操作
var result: Optional(i32) = Divide(10, 2)
.AndThen(fn (x: i32) -> Optional(i32) { return Divide(x, 2); });
三、Result类型 #
3.1 Result定义 #
carbon
enum Result[T, E] {
Ok(T),
Err(E)
}
3.2 使用Result #
carbon
class Error {
var message: String;
var code: i32;
}
fn ReadFile(path: String) -> Result(String, Error) {
if (path == "valid.txt") {
return Ok("文件内容");
}
return Err(Error(message = "文件不存在", code = 404));
}
match (ReadFile("valid.txt")) {
case Ok(content) => Print("内容: {0}", content);
case Err(error) => Print("错误: {0} (代码: {1})", error.message, error.code);
}
3.3 Result方法 #
carbon
var result: Result(i32, String) = Ok(42);
// 检查
if (result.IsOk()) {
Print("{0}", result.Value());
}
// 获取值或默认值
var value: i32 = result.ValueOr(0);
// 获取错误
if (result.IsErr()) {
Print("错误: {0}", result.Error());
}
// 转换
var doubled: Result(i32, String) = result.Map(fn (x: i32) -> i32 { return x * 2; });
3.4 错误传播 #
carbon
fn ProcessFile(path: String) -> Result(i32, Error) {
var content: String = try ReadFile(path);
var parsed: i32 = try ParseInt(content);
return Ok(parsed * 2);
}
// 等价于
fn ProcessFile(path: String) -> Result(i32, Error) {
var content_result: Result(String, Error) = ReadFile(path);
if (content_result.IsErr()) {
return Err(content_result.Error());
}
var content: String = content_result.Value();
var parsed_result: Result(i32, Error) = ParseInt(content);
if (parsed_result.IsErr()) {
return Err(parsed_result.Error());
}
var parsed: i32 = parsed_result.Value();
return Ok(parsed * 2);
}
四、错误处理最佳实践 #
4.1 使用自定义错误类型 #
carbon
enum AppError {
FileNotFound(String),
ParseError(String),
NetworkError(String),
Unknown
}
fn ReadConfig(path: String) -> Result(Config, AppError) {
if (not FileExists(path)) {
return Err(AppError.FileNotFound(path));
}
var content: String = try ReadFile(path);
var config: Config = try ParseConfig(content);
return Ok(config);
}
4.2 错误恢复 #
carbon
fn LoadConfig() -> Config {
match (ReadConfig("config.json")) {
case Ok(config) => return config;
case Err(AppError.FileNotFound(_)) => {
Print("配置文件不存在,使用默认配置");
return Config.Default();
}
case Err(error) => {
Print("加载配置失败: {0}", error);
return Config.Default();
}
}
}
4.3 错误链 #
carbon
fn WrapError[T, E, E2](result: Result(T, E), wrap: fn (E) -> E2) -> Result(T, E2) {
return match (result) {
case Ok(value) => Ok(value);
case Err(error) => Err(wrap(error));
};
}
fn HighLevelOperation() -> Result(Data, HighLevelError) {
var raw: RawData = try WrapError(LowLevelOperation(), fn (e: LowLevelError) -> HighLevelError {
return HighLevelError.LowLevel(e);
});
return Ok(Process(raw));
}
五、元编程基础 #
5.1 编译时计算 #
carbon
fn Factorial(n: i32) -> i32 {
if (n <= 1) {
return 1;
}
return n * Factorial(n - 1);
}
// 编译时计算
let Factorial5: i32 = Factorial(5); // 编译时计算为120
5.2 类型反射 #
carbon
fn TypeName[T]() -> String {
return T.Name;
}
Print("{0}", TypeName[i32]()); // "i32"
Print("{0}", TypeName[String]()); // "String"
5.3 代码生成 #
carbon
// 生成getter方法
macro GenerateGetters[T](fields: (String, Type)...) {
for (name, type in fields) {
fn Get##name(me) -> type {
return me.name##_;
}
}
}
class Person {
var name_: String;
var age_: i32;
GenerateGetters(("Name", String), ("Age", i32));
}
六、并发基础 #
6.1 并发任务 #
carbon
fn AsyncOperation() -> Future(i32) {
return async {
// 异步操作
return 42;
};
}
var future: Future(i32) = AsyncOperation();
var result: i32 = await future;
Print("{0}", result);
6.2 并行执行 #
carbon
fn ParallelProcess(items: [Data]) -> [Result] {
return Parallel.Map(items, fn (item: Data) -> Result {
return ProcessItem(item);
});
}
6.3 同步原语 #
carbon
class Counter {
var value_: i32 = 0;
var mutex_: Mutex;
fn Increment(me&) {
me.mutex_.Lock();
defer { me.mutex_.Unlock(); };
me.value_ += 1;
}
fn Value(me) -> i32 {
me.mutex_.Lock();
defer { me.mutex_.Unlock(); };
return me.value_;
}
}
七、总结 #
本章我们学习了:
- 高级模式匹配:结构体模式、嵌套模式、数组模式
- Option类型:定义、使用、方法、组合
- Result类型:定义、使用、错误传播
- 错误处理:自定义错误、错误恢复、错误链
- 元编程:编译时计算、类型反射
- 并发基础:异步任务、并行执行、同步原语
恭喜你完成了Carbon语言的学习!现在你已经掌握了从基础到高级的Carbon编程知识。
最后更新:2026-03-27