3 ms·
That is really marvelous. How is this kind of thing implemented under the hood? That new wizkid language Zig by Andrew Kelly - I wonder if it has anything simi
by goldenkey 8y ago
That is really marvelous. How is this kind of thing implemented under the hood?
That new wizkid language Zig by Andrew Kelly - I wonder if it has anything similar?
- a1369209993 8y agoYou can actually do the type-checking part of this even in C, it's just uglier: struct sock5_blank i1 = socks5_socket(); struct sock5_authed i2 = connect_unauthenticated(i1,proxy_addr); struct sock5_tcp i3 = connect_tcp(i1,addr); /* error: expected struct sock5_authed, got struct sock5_blank */ Rust adds the constraint that any (non-copyable,non-dropable) variable has to be passed to a function (or operator, or return statement) exactly once: Noncopyable a = ...; Copyable b = ...; f(a,b); //=> f(a,copy(&b)) // a is no longer in scope after this g(b); // this is fine, we took a reference to b and made a copy without changing the original h(a); // error: a is no longer a live variable
- rumcajz 8y agoThe problem with the C solution is that you'll get hanging pointers. Try using i1 after the code above executes and you'll get a runtime error.
- capitalsigma 8y agoYou can use C++ unique_ptr and turn on Clang warnings about "use after move", if you want that level of protection.
- a1369209993 8y agoEr, yes; that's what I said (or rather, hanging various things including but not limited to pointers). C only supported the typechecking part of this because it doesn't have any facilities for compile-time linearity checking. Linearity[0] and dependency[1] checking is what makes Rust a improvement over C, rather than yet another "let's reinvent C++, but slightly less awful" project. 0: "error: no implementation for copy〈T〉","error: no implementation for drop〈T〉"[2] 1: "error: cannot move/destroy x (of type T); y (of type T&'x) outlives it"
- tiuPapa 8y agoI think this is a feature of Rust's ownership model.