7 ms·
To expand on your float sorting example, sorting a slice[1] in Rust requires the element type to implement the Ord trait, i.e. be totally ordered. Trying to sor
by proto_lambda 4y ago
To expand on your float sorting example, sorting a slice[1] in Rust requires the element type to implement the Ord trait, i.e. be totally ordered. Trying to sort a slice of floats will result in a compiler error, even though it might be totally fine as long as all your floats are "ordinary".
Instead, to sort a slice of floats, you have to explicitly specify what would happen for the non-ordinary cases; e.g. by using `.sort_by(f32::total_cmp)`, where f32::total_cmp()[2] is one possible interpretation of a total ordering of floats. This requires writing more code even for cases where it would be completely unnecessary.
[1]: https://doc.rust-lang.org/std/primitive.slice.html#method.sort https://doc.rust-lang.org/std/primitive.slice.html#method.so...
[2]: https://doc.rust-lang.org/std/primitive.f32.html#method.total_cmp https://doc.rust-lang.org/std/primitive.f32.html#method.tota...
- Ygg2 4y agoSo rather than introducing a hard to detect bug (with NaN, Inf, -Inf), Rust makes me think about it and not just let whoever worked on compiler decide. How is this a negative? I'd rather program fail at compile than runtime, and rather it fail loudly than quietly. Also Rust doesn't prevent you from making optimal ordering, just a tinge more verbose.
- proto_lambda 4y ago> I'd rather program fail at compile than runtime, and rather it fail loudly than quietly. I agree! I was just illustrating the kind of tradeoff that has to be made for that to be possible.
- alpaca128 4y agoI also like this priority in Rust, which constantly makes me wonder why the developers allowed shadowing. It has already caused runtime bugs for me while the compiler didn't even throw a warning about it, and as Rust is otherwise so strict about making possible mistakes like this explicit it's definitely not the first cause I consider when debugging.
- proto_lambda 4y agoWhile I think shadowing is great for code readability and I've never encountered a bug caused by it, you can always make sure clippy doesn't let you do it by putting a `#![deny(clippy::shadow_reuse, clippy::shadow_same, clippy::shadow_unrelated)]` at the top level of your crate.
- tialaramex 4y agoLike proto I've never had this happen, even though I was initially sceptical until I found myself writing stuff like (real examples more complicated hence decision to break them down) let geese = something(lots_of_birds).bunch().of_chained().functions(); let geese = geese.somehow().just().count_them(); // We don't actually need geese, just # Could you name that first variable something else? Yeah. But, it's geese, it's not the number of geese, it's a different type, but it is just geese, that's the right name for it. OK, maybe rename the second variable? But number_of_geese is a stupid variable name, I would push back on a patch which tried to name a variable that because it's stupid. n_geese isn't stupid, but it is ugly and Rust is OK with me just naming it geese, so, geese it is. However, if you do run into trouble those Clippy rules can save you. You probably will find you don't want them all (or perhaps any of them) at deny, but Rust is content for you to decide you only want a warning (which you can then suppress where appropriate) and importantly these are three rules, you might well decide you only hate shadow_same or shadow_reuse or something. Here's the link specifically for shadow_reuse as an example: https://rust-lang.github.io/rust-clippy/master/#shadow_reuse https://rust-lang.github.io/rust-clippy/master/#shadow_reuse