Carbon泛型编程 #

一、泛型概述 #

泛型允许编写与类型无关的代码,提高代码复用性和类型安全性。Carbon的泛型系统比C++模板更安全,提供编译时类型检查。

二、泛型函数 #

2.1 基本泛型函数 #

carbon
fn Identity[T](x: T) -> T {
  return x;
}

var a: i32 = Identity(42);
var b: String = Identity("Hello");

2.2 多类型参数 #

carbon
fn Pair[T, U](first: T, second: U) -> (T, U) {
  return (first, second);
}

var p = Pair(1, "hello");  // (i32, String)

2.3 泛型约束 #

carbon
interface Numeric {
  fn Add(me, other: me) -> me;
  fn Zero() -> me;
}

fn Sum[T:! Numeric](values: [T]) -> T {
  var total: T = T.Zero;
  for (v in values) {
    total = total.Add(v);
  }
  return total;
}

2.4 多约束 #

carbon
interface Printable {
  fn Print(me);
}

interface Comparable {
  fn Compare(me, other: me) -> i32;
}

fn Max[T:! Printable and Comparable](a: T, b: T) -> T {
  if (a.Compare(b) >= 0) {
    a.Print();
    return a;
  }
  b.Print();
  return b;
}

三、泛型类 #

3.1 基本泛型类 #

carbon
class Box[T] {
  var value: T;
  
  fn New(value: T) -> Box[T] {
    return Box(value = value);
  }
  
  fn Get(me) -> T {
    return me.value;
  }
  
  fn Set(me&, value: T) {
    me.value = value;
  }
}

var int_box: Box[i32] = Box.New(42);
var str_box: Box[String] = Box.New("Hello");

3.2 泛型容器 #

carbon
class Stack[T] {
  var items: [T] = ();
  
  fn Push(me&, item: T) {
    me.items.Push(item);
  }
  
  fn Pop(me&) -> Optional(T) {
    if (me.items.Length() == 0) {
      return None;
    }
    return Some(me.items.Pop());
  }
  
  fn Peek(me) -> Optional(T) {
    if (me.items.Length() == 0) {
      return None;
    }
    return Some(me.items.Last());
  }
  
  fn IsEmpty(me) -> bool {
    return me.items.Length() == 0;
  }
}

var stack: Stack[i32] = Stack();
stack.Push(1);
stack.Push(2);
match (stack.Pop()) {
  case Some(v) => Print("{0}", v);  // 2
  case None => Print("空栈");
}

3.3 泛型约束类 #

carbon
class SortedList[T:! Comparable] {
  var items: [T] = ();
  
  fn Insert(me&, item: T) {
    var i: i32 = 0;
    while (i < me.items.Length() and me.items[i].Compare(item) < 0) {
      i += 1;
    }
    me.items.Insert(i, item);
  }
  
  fn Contains(me, item: T) -> bool {
    for (v in me.items) {
      var cmp: i32 = v.Compare(item);
      if (cmp == 0) {
        return true;
      }
      if (cmp > 0) {
        return false;
      }
    }
    return false;
  }
}

四、泛型接口 #

4.1 泛型接口定义 #

carbon
interface Container[Element] {
  fn Size(me) -> i32;
  fn IsEmpty(me) -> bool;
  fn Add(me&, element: Element);
  fn Get(me, index: i32) -> Optional(Element);
}

4.2 实现泛型接口 #

carbon
class ArrayList[T] {
  var items: [T] = ();
  
  impl Container[T] {
    fn Size(me) -> i32 {
      return me.items.Length();
    }
    
    fn IsEmpty(me) -> bool {
      return me.items.Length() == 0;
    }
    
    fn Add(me&, element: T) {
      me.items.Push(element);
    }
    
    fn Get(me, index: i32) -> Optional(T) {
      if (index >= 0 and index < me.items.Length()) {
        return Some(me.items[index]);
      }
      return None;
    }
  }
}

五、类型参数约束 #

5.1 接口约束 #

carbon
interface Hashable {
  fn Hash(me) -> u64;
}

class HashMap[Key:! Hashable and Comparable, Value] {
  var buckets: [[(Key, Value)]];
  
  fn New(size: i32 = 16) -> HashMap[Key, Value] {
    return HashMap(buckets = [[(Key, Value)]].New(size));
  }
  
  fn Insert(me&, key: Key, value: Value) {
    var index: i32 = i32(key.Hash() % u64(me.buckets.Length()));
    me.buckets[index].Push((key, value));
  }
  
  fn Get(me, key: Key) -> Optional(Value) {
    var index: i32 = i32(key.Hash() % u64(me.buckets.Length()));
    for ((k, v) in me.buckets[index]) {
      if (k.Compare(key) == 0) {
        return Some(v);
      }
    }
    return None;
  }
}

5.2 类型约束 #

carbon
fn Process[T:! String or i32](value: T) -> String {
  return match (T) {
    case String => value;
    case i32 => String(value);
  };
}

5.3 默认类型参数 #

carbon
class Result[T, E: Error = DefaultError] {
  var value: Optional(T);
  var error: Optional(E);
  
  fn Ok(value: T) -> Result[T, E] {
    return Result(value = Some(value), error = None);
  }
  
  fn Err(error: E) -> Result[T, E] {
    return Result(value = None, error = Some(error));
  }
  
  fn IsOk(me) -> bool {
    return me.value.HasValue();
  }
  
  fn IsErr(me) -> bool {
    return me.error.HasValue();
  }
}

六、泛型特化 #

6.1 部分特化 #

carbon
// 通用版本
fn ToString[T](value: T) -> String {
  return "Unknown";
}

// 特化版本:i32
fn ToString[i32](value: i32) -> String {
  return String(value);
}

// 特化版本:String
fn ToString[String](value: String) -> String {
  return value;
}

6.2 条件特化 #

carbon
fn Process[T:! Numeric](value: T) -> T {
  return value * 2;
}

fn Process[T:! String](value: T) -> T {
  return value + value;
}

七、泛型算法 #

7.1 排序 #

carbon
fn Sort[T:! Comparable](arr: [T]&) {
  for (i in 0..arr.Length()) {
    for (j in i + 1..arr.Length()) {
      if (arr[i].Compare(arr[j]) > 0) {
        var temp: T = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
      }
    }
  }
}

7.2 查找 #

carbon
fn Find[T:! Comparable](arr: [T], target: T) -> Optional(i32) {
  for (i, item in arr.Enumerate()) {
    if (item.Compare(target) == 0) {
      return Some(i);
    }
  }
  return None;
}

7.3 二分查找 #

carbon
fn BinarySearch[T:! Comparable](arr: [T], target: T) -> Optional(i32) {
  var left: i32 = 0;
  var right: i32 = arr.Length() - 1;
  
  while (left <= right) {
    var mid: i32 = (left + right) / 2;
    var cmp: i32 = arr[mid].Compare(target);
    
    if (cmp == 0) {
      return Some(mid);
    } else if (cmp < 0) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  
  return None;
}

八、高级泛型 #

8.1 可变参数泛型 #

carbon
fn MakeTuple[T...](values: T...) -> (T...) {
  return values;
}

var t1 = MakeTuple(1, 2, 3);           // (i32, i32, i32)
var t2 = MakeTuple(1, "hello", 3.14);  // (i32, String, f64)

8.2 泛型递归 #

carbon
fn Factorial[T:! Numeric](n: T) -> T {
  if (n <= T.One) {
    return T.One;
  }
  return n * Factorial(n - T.One);
}

8.3 高阶泛型 #

carbon
fn Apply[T, U](value: T, f: fn (T) -> U) -> U {
  return f(value);
}

fn Compose[T, U, V](f: fn (U) -> V, g: fn (T) -> U) -> fn (T) -> V {
  return fn (x: T) -> V { return f(g(x)); };
}

九、最佳实践 #

9.1 合理使用约束 #

carbon
// 好的做法:明确约束
fn Max[T:! Comparable](a: T, b: T) -> T {
  return if a.Compare(b) >= 0 then a else b;
}

// 避免:过度约束
fn Max[T:! Comparable and Printable and Serializable](a: T, b: T) -> T {
  return if a.Compare(b) >= 0 then a else b;
}

9.2 提供默认实现 #

carbon
interface Comparable {
  fn Compare(me, other: me) -> i32;
  
  fn LessThan(me, other: me) -> bool {
    return me.Compare(other) < 0;
  }
  
  fn GreaterThan(me, other: me) -> bool {
    return me.Compare(other) > 0;
  }
  
  fn Equal(me, other: me) -> bool {
    return me.Compare(other) == 0;
  }
}

9.3 文档化泛型 #

carbon
/// 泛型栈容器
/// 
/// 类型参数:
///   T - 栈中存储的元素类型
/// 
/// 示例:
///   var stack: Stack[i32] = Stack();
///   stack.Push(1);
///   stack.Pop();
class Stack[T] {
  // ...
}

十、总结 #

本章我们学习了:

  1. 泛型函数:基本泛型、多类型参数
  2. 泛型约束:接口约束、多约束
  3. 泛型类:基本泛型类、泛型容器
  4. 泛型接口:定义和实现
  5. 类型参数约束:接口约束、类型约束
  6. 泛型特化:部分特化、条件特化
  7. 泛型算法:排序、查找
  8. 高级泛型:可变参数、递归

接下来让我们学习Carbon的内存管理!

最后更新:2026-03-27