▲ | steveklabnik 5 days ago | ||||||||||||||||
> What does come up in practice is partial borrowing errors. For some people. For example, I personally have never had a partial borrowing error. > it definitely qualifies as having to fight/refactor to get obviously correct code to compile. This is not for sure. That is, while it's code that could work, it's not obviously clear that it's correct. Rust cares a lot about the contract of function signatures, and partial borrows violate the signature, that's why they're not allowed. Some people want to relax that restriction. I personally think it's a bad idea. | |||||||||||||||||
▲ | 5 days ago | parent | next [-] | ||||||||||||||||
[deleted] | |||||||||||||||||
▲ | hmry 5 days ago | parent | prev [-] | ||||||||||||||||
> Rust cares a lot about the contract of function signatures, and partial borrows violate the signature People want to be able to specify partial borrowing in the signatures. There have been several proposals for this. But so far nothing has made it into the language. Just to give an example of where I've run into countless partial borrowing problems: Writing a Vulkan program. The usual pattern in C++ etc is to just have a giant "GrahpicsState" struct that contains all the data you need. Then you just pass a reference to that to any function that needs any state. (of course, this is not safe, because you could have accidental mutable aliasing). But in Rust, that just doesn't work. You get countless errors like "Can't call self.resize_framebuffer() because you've already borrowed self.grass_texture" (even though resize_framebuffer would never touch the grass texture), "Can't call self.upload_geometry() because you've already borrowed self.window.width", and so on. So instead you end up with 30 functions that each take 20 parameters and return 5 values, and most of the code is shuffling around function arguments It would be so much nicer if you could instead annotate that resize_framebuffer only borrows self.framebuffer, and no other part of self. | |||||||||||||||||
|