手册目录

值与绑定

Feng 使用 let 声明不可重新赋值的绑定,使用 var 声明可以重新赋值的绑定。

声明绑定

有初始值时可以省略类型:

let language = "Feng";
var count = 0;
count += 1;

没有初始值时必须写出类型。Feng 会使用该类型的默认零值:

let retries: int;    // 0
let enabled: bool;   // false
let message: string; // ""
let values: int[];   // []

优先使用 let;只有确实需要重新赋值时才使用 var

绑定与对象可变性

绑定是否可重新赋值,与对象成员是否可修改是两层规则:

type User {
  var name: string;
}

let user = User { name: "Alice" };
user.name = "Bob";        // 合法:name 是 var 成员
// user = User {};         // 非法:user 是 let 绑定

数组也使用独立的元素可写标记。T[] 的当前层只读,T[!] 的当前层可写:

let readonly = [1, 2, 3];
let writable: int[!] = [1, 2, 3];
writable[0] = 10;
// readonly[0] = 10;       // 非法

参数绑定

参数必须声明类型。省略 letvar 时默认不可重新赋值:

func add(a: int, b: int): int {
  return a + b;
}

func advance(step: int, var position: int): int {
  position += step;
  return position;
}

参数按值进入函数;var 只允许在函数体中修改参数绑定,不会把重新赋值写回调用方的绑定。

块作用域

绑定从声明位置开始,在所在块及其子块中可见。子块可以用同名绑定屏蔽外层绑定:

let label = "outer";

if true {
  let label = "inner";
  println(label);
}

println(label);

子块结束后,外层的 label 会重新可见。

解构绑定

具名元组和元组字面量可以按位置解构:

type Pair(int, string);

let pair: Pair = (7, "seven");
let (number, text) = pair;
let (first, second) = (1, 2);
let (, only_text) = pair;

空位置表示丢弃对应值。Feng 当前只支持单层解构。