4 ms·
I debated which terminology to use and thought "throwing away" was more intuitive, especially if you've never heard of "binding" before. It has its limits thou
by fasterthanlime 7y ago
I debated which terminology to use and thought "throwing away" was more intuitive, especially if you've never heard of "binding" before.
It has its limits though - in your example I'd say you're throwing away the result of evaluating "x", just as if you did:
x;
- kzrdude 7y agoI don't agree, because we can try the two following programs, and one of them does not compile. It compiles with underscore. 1: let x = String::new(); let _ = x; println!("{}", x); 2: let x = String::new(); x; println!("{}", x); // ERROR: Use of moved value x. And this is why I said that let _ = x; is a no-op. :)
- Tehnix 7y agoI think no-op is a bit misleading, and throwing away is more precise, since Rust has strict evaluation. let _ = timeConsumingFunction(); Still needs to spend time performing timeConsumingFunction(). It might not move, but it still did the work and produced a result, you are just not using it (and hence not need to move it). If you you had lazy evaluation I would agree with your argument for the no-op terminology.
- kzrdude 7y agoThat statement is different, the rhs is not a variable's name, so I agree with you, all of that is not a no-op.
- fasterthanlime 7y agoHuh, TIL! Had no idea `x;` actually moved `x`.
- AnimalMuppet 7y agoBut where is it moved to? Who owns it now? Or is it just lost?
- kzrdude 7y agoyes, it is dropped
- runarberg 7y agoAhh, I remember a while back reading a blog where the author talked about `std::mem::drop` being their favorite standard library function because they used this effect. It is literately defined as: pub fn drop<T>(_x: T) { } https://doc.rust-lang.org/std/mem/fn.drop.html https://doc.rust-lang.org/std/mem/fn.drop.html
- kzrdude 7y agoRight, so drop is useless :) We can drop things fine without it. Since of course it's scope/ownership based and not something that's explicitly called.
- AnimalMuppet 7y agoWell, drop(x); is a lot clearer than x;
- e_proxus 7y agoSo is drop like free, or is it something else?
- cyphar 7y agoYes, it's effectively like free -- though C++'s "auto" is probably a closer idea. The main difference to C's free is that you simply cannot double-free a value (without using unsafe). That's because a value is only dropped when it falls out of scope -- and since it values only have one owner (and references must not outlive values) there cannot be any dangling references after it's dropped. The documentation for std::mem::drop is explaining that dropping a value is a property of the language and scoping rules -- thus there is nothing for the function to do other than take a value and let it go out of scope.
- kzrdude 7y agoWhen you put it like that, I see that it's a rather minor detail.
- aallen90 7y agoIn C#, _ is called a "discard" variable. I found that to be an apt term to grasp the concept quickly.