锡兰的属性(吸气剂和固定剂)

时间:2018-03-31 21:15:39

标签: properties 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);

我如何在锡兰这样做?

2 个答案:

答案 0 :(得分:4)

声明

Getters就像定义一个没有参数列表的函数。然后,getter主体的行为类似于普通函数,并且必须返回属性的计算值。

variable String local_var = "Hello world!";

// Getter
String name1 {
    return local_var;
}

// Also getter, using functional syntax for body
String name2 => local_var;
使用assign关键字声明

Setters。然后,setter主体的行为类似于void函数,执行适当的本地环境变化并且不得返回值。分配的传入值可以通过属性名称在正文中引用。

// Setter
assign name1 {
    local_var = name1; // name1 here is value being assigned
}

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

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

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;

答案 1 :(得分:2)

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