我最近被这样一个事实绊倒了:设置 an 的 setter 的预期类型Int
是Int -> Int
.
为什么 setter 会返回一个值?这个值有什么意义?
除了此处的其他答案之外,它还允许您执行以下操作:
x = y = z = 5;
setter 返回的值是赋值表达式的值。
例如,如果您要执行以下操作:
public var x(setX, getX): Int
public function setX(val: Int): Int {
return 5;
}
static function main() {
neko.Lib.print(x = 2); // Prints 5
}
Haxe 会打印出 5。setter 返回 set 表达式的值。当然,在这种情况下,这是一个荒谬的值。
在现实世界中,它允许在赋值时实现按值复制的方式,例如:
public var pos(set_pos, default):Point;
function set_pos(newPos:Point) {
pos.x = newPos.x
pos.y = newPos.y;
return pos;
}
并且在实现可能失败的设置器时也有一个合理的回报,例如:
public var positiveX(default, set_positiveX):Int;
function set_positiveX(newX:Int) {
if (newX >= 0) x = newX;
return x;
}
trace(x = 10); // 10
trace(x = -4); // 10
trace(x); // 10
而你会得到这样的东西:
trace(x = 10); // 10
trace(x = -4); // -4
trace(x); // 10
即使设置器不修改值,AS3 中也会发生这种情况。如果你不能这样做,显然第一个,其中 x = -4 返回 10 更好:)