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;
  }
}

十一、总结 #

本章我们学习了:

  1. 结构体定义:基本定义、创建实例
  2. 成员访问:访问、修改、解构
  3. 方法:实例方法、修改方法、静态方法
  4. 构造函数:自定义构造、验证构造
  5. 嵌套结构体:成员结构体、嵌套访问
  6. 运算符重载:自定义运算符行为
  7. 接口实现:实现接口、多接口

接下来让我们学习Carbon的类与面向对象!

最后更新:2026-03-27