/ / D (2) Programación: llamadas de funciones de encadenamiento en struct - struct, d, chaining, d2

Programación D (2): las funciones de encadenamiento llaman a struct - struct, d, encadenamiento, d2

Mi estructura parece estar rota, no puedo entender por qué:

struct FilterBoundary {

private uint start;
private uint end;

public static immutable uint MIN = 0;
public static immutable uint MAX = uint.max;

public this(uint start=0, uint end=0){
checkRange(start,end);
this.start=start;
this.end=end;
}

public uint getStart(){
return this.start;
}

public uint getEnd(){
return this.end;
}

private void checkRange(uint start, uint end){
if(start>end){
throw new Exception("Invalid range.");
}
}

public FilterBoundary setStart(uint start){
checkRange(start,this.end);
this.start=start;
return this;
}

public FilterBoundary setEnd(uint end){
checkRange(this.start,end);
this.end=end;
return this;
}
}

Este código

auto r1 = FilterBoundary(6, 7);

//Correct
writeln(r1);

r1.setStart(5);
//Correct
writeln(r1);

//Wrong end set to 9 but start stays to 5
r1.setEnd(9).setStart(2);
writeln(r1);

Produce esta salida:

FilterBoundary(6, 7)
FilterBoundary(5, 7)
FilterBoundary(5, 9)

Respuestas

3 para la respuesta № 1

Las estructuras son tipos de valor: cuando setStart y setEnd regreso this, en realidad están devolviendo una copia de la estructura. Así, el segundo setStart la llamada funciona en una copia temporal, que se descarta.

Puede evitar esto volviendo &this (y cambiando el valor de retorno a FilterBoundary* apropiadamente). Solo tenga cuidado, esto puede ser inseguro: debido a que las estructuras pueden vivir en la pila, guardar un puntero puede hacer que se convierta en un puntero colgante y acceder a ella puede dañar la memoria.