手册目录

自定义类型

type 把数据和行为组织为具名类型。对象类型是托管引用类型;具名元组是值类型。

字段与对象字面量

type User {
  let id: int;
  var name: string;
}

let user = User { id: 1, name: "Alice" };
user.name = "Bob";

let 字段在完成初始化后不可修改,var 字段可以修改。对象赋值复制引用:

let alias = user;
alias.name = "Carol";
println(user.name); // Carol

构造函数

构造函数与类型同名,通过 self 初始化当前对象:

type User {
  let id: int;
  var name: string;

  func User(id: int, name: string) {
    self.id = id;
    self.name = name;
  }
}

let user = User(1, "Alice");
let renamed = User(2, "Bob") { name: "Carol" };

没有显式构造函数时,可使用默认无参构造和对象字面量。对象字面量也可以在构造后覆盖尚可绑定或可写的成员。

方法

type Counter {
  var value: int;

  func increment() {
    self.value += 1;
  }

  func current(): int {
    return self.value;
  }
}

实例方法通过 self 访问当前实例。方法可以重载,但不能只依靠返回类型区分。

静态成员

type Counter {
  open static var created: int = 0;

  open static func create(): Counter {
    Counter.created += 1;
    return Counter {};
  }

  var value: int;
}

let counter = Counter.create();

静态成员通过类型名访问,不能通过实例访问。

终结器

需要释放外部资源时,可以定义终结器:

type Resource {
  var handle: int;

  func Resource(handle: int) {
    self.handle = handle;
  }

  func ~Resource() {
    // 释放由 handle 表示的外部资源
  }
}

托管内存由 Feng 自动管理;终结器适合清理文件句柄等非托管资源。可预测的词法清理优先使用 defer,详见异常处理

具名元组与值类型

圆括号形式声明具名元组;@value 可用于声明值语义对象类型。二者的复制与生命周期规则不同于普通对象类型。