Должны ли мы возвращать значение в сеттере?

В 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