锡兰的属性(getter 和 setter)

Properties (getters and setters) in Ceylon

如何在 Ceylon 中定义 属性?我知道我可以编写 getNamesetName 函数来获取和设置支持变量:

class Circle(shared variable Float radius) {
    shared Float getArea() {
        return pi * radius ^ 2;
    }

    shared void setArea(Float area) {
        radius = sqrt(area / pi);
    }
}

value circle = Circle(4.0);
circle.setArea(10.0);
print(circle.getArea());

但我希望能够提供对 属性:

的类似属性的访问
value circle = Circle(4.0);
circle.area = 10.0;
print(circle.area);

我如何在锡兰执行此操作?

Getters 的声明类似于定义没有参数列表的函数。 getter 函数体的行为就像一个普通函数,并且必须 return 属性.

的计算值
variable String local_var = "Hello world!";

// Getter
String name1 {
    return local_var;
}

// Also getter, using functional syntax for body
String name2 => local_var;

Setters 是使用 assign 关键字声明的。 setter 主体然后表现得像一个 void 函数,执行任何适当的局部环境变化,并且不能 return 一个值。可以通过 属性.

的名称在正文中引用正在分配的传入值
// Setter
assign name1 {
    local_var = name1; // name1 here is value being assigned
}

// Also setter, using modified functional syntax
assign name2 => local_var = name2;

与大多数编程语言不同,属性可以是包的顶级成员,而不仅仅是 class:

的成员
class Circle(shared variable Float radius) {
    // Class-level getter
    shared Float area {
        return pi * radius ^ 2;
    }

    // Class-level setter
    assign area {
        radius = sqrt(area / pi);
    }
}

Circle window = Circle(1.0);

// Top-level getter
Circle outer_window => Circle(window.radius * 2);

// Top-level setter
assign outer_window => window.radius = outer_window.radius / 2;

附加评论:在 Java 后端,Ceylon getter 和 setter 编译为 Java getter 和 setter(使用标准 getFoo/setFoo 名称,或 isFoo 用于 Boolean 属性)。强烈建议不要定义名为 getter 和 setter 的常规函数​​,例如问题中的 getAreasetArea,如果您确实定义了它们,它们的支持函数实际上将被称为不同的东西(例如$getArea) 以避免与编译器自动生成的 getter 和 setter 发生冲突。