Трябва ли да връщаме стойност при сетер?

В haxe документацията на свойствата има пример:

class C {

 public var x(get,set) : Int;

 function get_x(){ return 123; } 

 function set_x(value){ 
   doSomethingWith(value); 
   return 123; 
 } 
}

Но защо трябва да връщаме стойност в сетер на x по-горе? има ли основателна причина


person simo    schedule 09.12.2013    source източник


Отговори (2)


Причината е, че в Haxe изразът за присвояване връща стойност, напр.

var a;
trace(a = 3.14);//3.14

Естествено е, тъй като можем да веригираме задачи заедно:

var test = a = 3.14; //test will be 3.14

Например има един странен клас,

class Weird {
    public function new():Void {}
    public var x(get, set):Int;
    function get_x() return x;
    function set_x(v:Int):Int {
        x = v;
        return 123;
    }
}

var weird = new Weird();
trace(weird.x = 456); //123
trace(weird.x); //456
var test = weird.x = 456; //test will be 123

Но, разбира се, обикновено просто връщаме входа на сетера, защото е по-логично:

function set_x(v:Int):Int {
    return x = v;
}
person Andy Li    schedule 09.12.2013
comment
Да, така е. Това е оптимизация спрямо AS3, която всъщност ще извика инструмента за получаване, за да определи стойността на израз за присвояване. - person back2dos; 10.12.2013

Понякога е просто хубаво функцията за настройка да връща предишната стойност, така че можете да кодирате по следния начин:

oldval=set(newval);
do_something();
set(oldval);

за временно задаване на нова стойност, след което възстановете старата, след като приключите.

person Guntram Blohm    schedule 09.12.2013
comment
Не. Това е начинът, по който може да се използва сетер, ако връща предишната стойност. Исках да обясня как сетер, който действа и като гетер, може да спести време, когато се опитвате да го използвате. - person Guntram Blohm; 09.12.2013