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

注意,不需要​​"break"​​.

如,​​DIP1000​​​甚至不支持在​​同一个结构​​​的​​不同字段​​​中存储具有不同​​生命期​​​对象.
是的.​​​DIP1000​​​根本不跟踪​​生命期​​​.它只跟踪​​域内​​​生命期.​​跟踪​​​需要​​分析​​​数据流,这在​​@live​​​的活.
根本问题是​​​DIP1000​​​缺乏​​模块化​​​方法来​​跟踪​​​不同生命期.
​​​DIP1000​​​非常喜欢​​合并​​​不同​​生命期​​​,并选择短的.
​​​放松​​​安全性是​​@信任​​​的工作,类似​​Rust​​​的​​不安全​​​,因为​​Rust​​的表达能力也是有限的.