感觉zig的defer没有c++的raii和rust的drop好用 #290
Replies: 4 comments
-
|
zig 毕竟讲究没有隐式执行流。ArrayList(ArrayList(i32)) 在 deinit 的时候如果把内部也 deinit 就不符合 zig 的原则了。 |
Beta Was this translation helpful? Give feedback.
-
|
最简单的办法就是把结构包装一下。不过我认为zig的做法是正确的,因为析构或者说释放一些资源是一个多方面的动作,对于没有分配器的C++/Rust来说可以直接释放,但是一旦遇到了“部分所有权”,“不完全所有权”,还有许多底层操作的话RAII/Ownership就会变成地雷。支持泛型但是不支持接口/特征也加重了这一点问题,不过既然zig不是HM类型的ML,这倒是保持了内存透明也挺好的。 |
Beta Was this translation helpful? Give feedback.
-
|
我认为语言最重要的是自恰,如果存在隐藏逻辑能把内部的一起析构,那么这个feature在当前版本的zig就变成了一个异物。zig还没有发展到把这种东西纳入进来的程度(也有可能是不会往这个方向发展) |
Beta Was this translation helpful? Give feedback.
-
|
Rust的所有权概念诞生于C++的RAII的局限性。可以认为是RAII的缺陷催生了Rust。从这方面理解就可以知道Zig的defer是对的。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
该问题主要存在于泛型类中。
例如容器在deinit的时候没法把保存在容器中的元素也deinit。ArrayList(ArrayList(i32))在defer的时候得手动先把内部deinit再把外部deinit。
虽然可以通过反射判断元素是否存在deinit函数,来选择性deinit元素,但依然存在两个问题:
Beta Was this translation helpful? Give feedback.
All reactions