天天看点

d的dip1000与live

int* foo(return scope int* x)@safe{
     auto y=x;
     int t;
     auto z=&t;
     return y; // 可,但不返回z
}      

它并不​

​跟踪​

​​生命期,它只是从x复制属性到​

​y​

​​.因为它是用​

​栈变量​

​​地址初化的,所以​

​z​

​​取​

​scope​

​属性.

​@live​

​​的目的是为了防止:

​​

​1​

​​.​

​释放​

​​后使用

​​

​2​

​​.多​

​释放​

​​

​3​

​.无​

​释放​

更进一步,需要用户构建​

​封装​

​​的​

​容器​

​​,并可能包括一些部分​

​Rust``@trusted​

​​功能

如果没有上面的​​

​1,2,3​

​​,​

​DIP1000​

​​就不是完整​

​方法​

​​,这是正确的.但​

​dip1000​

​​是实现​

​1,2,3​

​的必要前提.

默认,​

​直降​

​​在很多年前就从​

​D​

​​中删除了.

第二个难题是,可在​​

​嵌套​

​​域中放​

​case​

​​语句.

最好还是让​​

​switch​

​​保持​

​原样​

​​,开发新​

​模式匹配​

​​构造,以适应​

​现代人​

​​感受.

,每个​​

​case​

​​都引入了​

​新域​

​.

int main(){
    int x;
    switch(x){
        case 0:
            int y;
            break;
        case 1:
            int y;
            break;
        default:
            int y;
            break;
    }
    return 0;
}      

在​

​C​

​​和​

​D​

​​间切换搞混了.

另一个问题是​​

​switch case​

​​没有顺序,应该是不​

​相交​

​​的.但是对​

​模式匹配​

​​,​

​语义​

​​一般是​

​按顺序​

​​每个可​

​覆盖​

​​,且应把​

​更具体​

​​模式放在​

​前面​

​​的模式.

​​

​switch​

​​语法也是​

​老式​

​​的,​

​更现代​

​语法是:

match (x){
    0 => foo();
    3 => bar();
}      

继续阅读