Carbon结构体 #
一、结构体概述 #
结构体(struct)是自定义数据类型,用于组合多个相关字段。结构体是面向对象编程的基础。
二、定义结构体 #
2.1 基本定义 #
carbon
struct Point {
var x: f64;
var y: f64;
}
2.2 创建实例 #
carbon
var p1: Point = Point(x = 1.0, y = 2.0);
var p2: Point = Point {.x = 1.0, .y = 2.0};
2.3 默认值 #
carbon
struct Point {
var x: f64 = 0.0;
var y: f64 = 0.0;
}
var origin: Point = Point(); // x=0.0, y=0.0
三、访问成员 #
3.1 成员访问 #
carbon
var p: Point = Point(x = 3.0, y = 4.0);
Print("x = {0}", p.x); // 3.0
Print("y = {0}", p.y); // 4.0
// 修改成员
p.x = 5.0;
p.y = 12.0;
3.2 解构 #
carbon
var p: Point = Point(x = 3.0, y = 4.0);
var (x, y) = p;
Print("({0}, {1})", x, y);
3.3 成员函数 #
carbon
struct Point {
var x: f64;
var y: f64;
fn Distance(me) -> f64 {
return (me.x * me.x + me.y * me.y).Sqrt();
}
fn Translate(me, dx: f64, dy: f64) -> Point {
return Point(x = me.x + dx, y = me.y + dy);
}
}
var p: Point = Point(x = 3.0, y = 4.0);
Print("距离: {0}", p.Distance()); // 5.0
四、方法 #
4.1 实例方法 #
carbon
struct Rectangle {
var width: f64;
var height: f64;
fn Area(me) -> f64 {
return me.width * me.height;
}
fn Perimeter(me) -> f64 {
return 2.0 * (me.width + me.height);
}
fn IsSquare(me) -> bool {
return me.width == me.height;
}
}
var rect: Rectangle = Rectangle(width = 5.0, height = 3.0);
Print("面积: {0}", rect.Area()); // 15.0
Print("周长: {0}", rect.Perimeter()); // 16.0
Print("是正方形: {0}", rect.IsSquare()); // false
4.2 修改方法 #
carbon
struct Counter {
var count: i32 = 0;
fn Increment(me&) {
me.count += 1;
}
fn Reset(me&) {
me.count = 0;
}
}
var c: Counter = Counter();
c.Increment();
c.Increment();
Print("{0}", c.count); // 2
4.3 静态方法 #
carbon
struct Point {
var x: f64;
var y: f64;
fn Origin() -> Point {
return Point(x = 0.0, y = 0.0);
}
fn New(x: f64, y: f64) -> Point {
return Point(x = x, y = y);
}
}
var origin: Point = Point.Origin();
var p: Point = Point.New(3.0, 4.0);
五、构造函数 #
5.1 自定义构造函数 #
carbon
struct Person {
var name: String;
var age: i32;
fn New(name: String, age: i32) -> Person {
return Person(name = name, age = age);
}
fn Default() -> Person {
return Person(name = "Unknown", age = 0);
}
}
var p1: Person = Person.New("Alice", 30);
var p2: Person = Person.Default();
5.2 验证构造 #
carbon
struct PositiveNumber {
var value: i32;
fn New(value: i32) -> Optional(PositiveNumber) {
if (value > 0) {
return Some(PositiveNumber(value = value));
}
return None;
}
}
match (PositiveNumber.New(5)) {
case Some(n) => Print("值: {0}", n.value);
case None => Print("无效输入");
}
六、结构体与函数 #
6.1 作为参数 #
carbon
fn PrintPoint(p: Point) {
Print("({0}, {1})", p.x, p.y);
}
fn DistanceBetween(p1: Point, p2: Point) -> f64 {
var dx: f64 = p2.x - p1.x;
var dy: f64 = p2.y - p1.y;
return (dx * dx + dy * dy).Sqrt();
}
6.2 返回结构体 #
carbon
fn Midpoint(p1: Point, p2: Point) -> Point {
return Point(
x = (p1.x + p2.x) / 2.0,
y = (p1.y + p2.y) / 2.0
);
}
6.3 引用传递 #
carbon
fn Scale(p: Point&, factor: f64) {
p.x *= factor;
p.y *= factor;
}
var p: Point = Point(x = 3.0, y = 4.0);
Scale(p, 2.0);
Print("({0}, {1})", p.x, p.y); // (6.0, 8.0)
七、嵌套结构体 #
7.1 成员结构体 #
carbon
struct Address {
var street: String;
var city: String;
var country: String;
}
struct Person {
var name: String;
var address: Address;
}
var person: Person = Person(
name = "Alice",
address = Address(
street = "123 Main St",
city = "New York",
country = "USA"
)
);
Print("{0}住在{1}", person.name, person.address.city);
7.2 嵌套访问 #
carbon
fn GetCity(person: Person) -> String {
return person.address.city;
}
fn UpdateCity(person: Person&, new_city: String) {
person.address.city = new_city;
}
八、结构体方法进阶 #
8.1 链式调用 #
carbon
struct Builder {
var name: String = "";
var age: i32 = 0;
var email: String = "";
fn SetName(me&, name: String) -> Builder& {
me.name = name;
return me;
}
fn SetAge(me&, age: i32) -> Builder& {
me.age = age;
return me;
}
fn SetEmail(me&, email: String) -> Builder& {
me.email = email;
return me;
}
fn Build(me) -> Person {
return Person(name = me.name, age = me.age);
}
}
var person: Person = Builder()
.SetName("Alice")
.SetAge(30)
.SetEmail("alice@example.com")
.Build();
8.2 运算符重载 #
carbon
struct Vector {
var x: f64;
var y: f64;
fn OpAdd(me, other: Vector) -> Vector {
return Vector(x = me.x + other.x, y = me.y + other.y);
}
fn OpSub(me, other: Vector) -> Vector {
return Vector(x = me.x - other.x, y = me.y - other.y);
}
fn OpMul(me, scalar: f64) -> Vector {
return Vector(x = me.x * scalar, y = me.y * scalar);
}
}
var v1: Vector = Vector(x = 1.0, y = 2.0);
var v2: Vector = Vector(x = 3.0, y = 4.0);
var sum: Vector = v1 + v2;
var scaled: Vector = v1 * 2.0;
九、结构体与接口 #
9.1 实现接口 #
carbon
interface Drawable {
fn Draw(me);
}
struct Circle {
var x: f64;
var y: f64;
var radius: f64;
impl Drawable {
fn Draw(me) {
Print("绘制圆形,半径: {0}", me.radius);
}
}
}
struct Rectangle {
var x: f64;
var y: f64;
var width: f64;
var height: f64;
impl Drawable {
fn Draw(me) {
Print("绘制矩形,大小: {0}x{1}", me.width, me.height);
}
}
}
9.2 多接口实现 #
carbon
interface Printable {
fn Print(me);
}
interface Comparable {
fn Compare(me, other: me) -> i32;
}
struct Point {
var x: f64;
var y: f64;
impl Printable {
fn Print(me) {
Print("({0}, {1})", me.x, me.y);
}
}
impl Comparable {
fn Compare(me, other: Point) -> i32 {
var d1: f64 = me.x * me.x + me.y * me.y;
var d2: f64 = other.x * other.x + other.y * other.y;
return if d1 < d2 then -1 else if d1 > d2 then 1 else 0;
}
}
}
十、结构体最佳实践 #
10.1 封装 #
carbon
struct BankAccount {
var balance_: f64;
fn New(initial: f64) -> BankAccount {
return BankAccount(balance_ = initial);
}
fn Balance(me) -> f64 {
return me.balance_;
}
fn Deposit(me&, amount: f64) {
if (amount > 0) {
me.balance_ += amount;
}
}
fn Withdraw(me&, amount: f64) -> bool {
if (amount > 0 and me.balance_ >= amount) {
me.balance_ -= amount;
return true;
}
return false;
}
}
10.2 不可变设计 #
carbon
struct ImmutablePoint {
var x: f64;
var y: f64;
fn New(x: f64, y: f64) -> ImmutablePoint {
return ImmutablePoint(x = x, y = y);
}
fn WithX(me, new_x: f64) -> ImmutablePoint {
return ImmutablePoint(x = new_x, y = me.y);
}
fn WithY(me, new_y: f64) -> ImmutablePoint {
return ImmutablePoint(x = me.x, y = new_y);
}
}
10.3 验证 #
carbon
struct Email {
var address: String;
fn New(address: String) -> Optional(Email) {
if (address.Contains("@")) {
return Some(Email(address = address));
}
return None;
}
}
十一、总结 #
本章我们学习了:
- 结构体定义:基本定义、创建实例
- 成员访问:访问、修改、解构
- 方法:实例方法、修改方法、静态方法
- 构造函数:自定义构造、验证构造
- 嵌套结构体:成员结构体、嵌套访问
- 运算符重载:自定义运算符行为
- 接口实现:实现接口、多接口
接下来让我们学习Carbon的类与面向对象!
最后更新:2026-03-27