结构体
定义
这个 struct 构造引入一个名义上类型化的或命名的产品。
struct Point {
x: int;
y: int;
}
instance Str[Point] {
fun str (p:Point) =>
"Point(" + p.x.str + ", " + p.y.str + ")"
;
}
var p = Point (2,3);
println$ p.str;
这里,我们注意到一个点由两个整数组成,x和y,我们可以通过将类型名Point应用于一对整数来确定点。
我们还提供了一个 Str 用方法分类 str 或类型 Point->string 把一个点转换成人类可读的形式。 Str 是一个普遍开放的标准库类。
方法
结构可以有两种方法: accessors 和 mutators . 以下是Point的扩展版本:
struct Point {
x: int;
y: int;
fun norm => max (self.x, self.y);
proc reset { self.x <- 0; self.y <- 0; }
proc set (a:int, b:int) { self.x <- a; self.y <- b; }
}
var p = Point (1,2);
var y = p.norm;
p.set(p.x + 1, p.y + 1);
访问器,使用 fun binder,隐式获取一个额外的参数 self 类型的 Point . 变异子,带 proc binder,隐式获取一个额外的参数 self 类型的 &Point ,指向一个点的指针。
对象闭包
实际上,这些方法都是普通的函数和过程。嵌套只是语法上的甜点:
struct Point {
x: int;
y: int;
}
fun norm (self: Point) => max(self.x, self.y);
proc reset (self: &Point) { self.x <- 0; self.y <- 0; }
proc set (self: &Point) (a:int, b:int) { self.x <- a; self.y <- b; }
因此,这些方法是高阶函数,我们可以在Point类型的对象上形成闭包:
var p = Point (1,2);
var setp = &p.set; // object closure
var resetp = { &p.reset; }; // object closure
setp (23,42);
println$ p.str;
resetp;
println$ p.str;
注意 &p.reset 将调用reset,因此我们需要在通用闭包构造函数中包装调用 {{_}} .