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();
}
注意,不需要"break".
如,DIP1000甚至不支持在同一个结构的不同字段中存储具有不同生命期对象.
是的.DIP1000根本不跟踪生命期.它只跟踪域内生命期.跟踪需要分析数据流,这在@live的活.
根本问题是DIP1000缺乏模块化方法来跟踪不同生命期.
DIP1000非常喜欢合并不同生命期,并选择短的.
放松安全性是@信任的工作,类似Rust的不安全,因为Rust的表达能力也是有限的.
浙公网安备 33010602011771号