2306d的必须用应检查转换

原文
这是我在使用@mustuse时遇见的问题.
可不检查错误的,很好地使用该结构.
虽然我不确定opCast(T:bool)是否总是应该为此,但如果没有,应该可要求编译器发出错误,尽管当在opApply/opApplyReverse时最好不要这样.

我使用opCast的原因是因为它已整合到if语句中,使得(因为未检查错误),在程序未崩溃时时非常好用.

否则,即使它是null,别名 本到方法就行了.

我不理解,请举一个代码示例.
好吧,假设有个错误结构:

@mustuse struct Result(T) {
   private T* value;
   bool isNull() {
       return value is null;
   }
   ref T get() {
       return *value;
   }
   alias get this;
}

把它传递函数(本例中,带一个参数):

void myFunction(Result!int arg) {
    writeln(arg.get);
}

太好了,你使用了变量!但使用@mustuse要点是可保证检查了错误.

因此,想要(如上面示例中的isNull来)检查函数,而不仅是调用方法.
否则,最终会遇见运行时而不是编译时错误(与我一直经历的那样).

@mustuse应该避免丢弃该类型值.我不喜欢附加有关"opCast"其他规则,到应该简单且正交的功能上.你可能想要TimonGehr一直在倡导的类型状态,但这需要DIP.

它不必一定是opCast,这只是个用例.
基本上,我需要告诉编译器,如果没有立即调用这些指定方法中的一个,则即使调用了其他方法,也应丢弃该值.

丹尼斯是对的.这完全超出了@mustuse的职权区间.你所期望不仅是保证已使用对象,而且(根据某些定义标准)是正确使用.
对该特定示例,最好是重新设计你的Result类型,以便必须检查null时才能访问包装值.如下是个可能的方法:

import core.attribute, std.stdio;
@mustuse struct Result {
    private int* value;
    bool isNull() => value is null;
    int opApply(scope int delegate(int) dg)
    {
        if (value is null) return 0;
        return dg(*value);
    }
}
Result getResult() => Result(new int(42));
void main()
{
    auto r = getResult();
    foreach (int n; r)
        writeln("got ", n);
}

你可能感兴趣的:(dlang,d,d,检查)