D(2)编程:链接函数调用struct

D(2)编程:链接函数调用struct,struct,chaining,d,Struct,Chaining,D,我的结构好像坏了,我不知道为什么: 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=st

我的结构好像坏了,我不知道为什么:

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;
}
}
此代码

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);
生成此输出:

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

结构是值类型:当
setStart
setEnd
返回
this
时,它们实际上是返回结构的副本。因此,第二个
setStart
调用操作一个临时副本,该副本被丢弃

您可以通过返回
和this
(并适当地将返回值更改为
FilterBoundary*
)来解决此问题。请注意,这可能是不安全的:因为结构可以位于堆栈上,保存指向它的指针可能会导致它成为悬空指针,访问它可能会损坏内存