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 № 1Strukturen sind Werttypen: wann setStart
und setEnd
Rückkehr this
geben 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.