/ / D (2) Programmierung: Verkettungsfunktionen rufen struct - struct, d, chaining, d2 auf

D (2) Programmierung: Verkettungsfunktionen Aufruf von struct - struct, d, Verkettung, d2

Meine Struktur scheint kaputt zu sein, ich kann mir nicht vorstellen warum:

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;
}
}

Dieser Code

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);

Erzeugt diese Ausgabe:

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

Antworten:

3 für die Antwort № 1

Strukturen sind Werttypen: wann setStart und setEnd Rückkehr thisgeben sie tatsächlich eine Kopie der Struktur zurück. Also der zweite setStart Der Anruf wird mit einer temporären Kopie ausgeführt, die verworfen wird.

Sie können dies umgehen, indem Sie zurückkehren &this (und Ändern des Rückgabewerts in FilterBoundary* passend). Seien Sie nur vorsichtig, dies kann unsicher sein: Da Strukturen auf dem Stapel leben können, kann das Speichern eines Zeigers darauf dazu führen, dass er zu einem baumelnden Zeiger wird, und der Zugriff darauf kann den Speicher beschädigen.