▲ | hmry 3 months ago | |||||||
> 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. | ||||||||
▲ | steveklabnik 3 months ago | parent [-] | |||||||
> People want to be able to specify partial borrowing in the signatures. That's correct. That's why I said "Some people want to relax that restriction. I personally think it's a bad idea." > 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. Yes, I think that this style of programming is not good, because it creates giant balls of aliasing state. I understand that if the library you use requires you to do this, you're sorta SOL, but in the programs I write, I've never been required to do this. > 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 Yes, this is the downstream effects of designing APIs this way. Breaking them up into smaller chunks of state makes it significantly more pleasant. I am not sure that it's a good idea to change the language to make using poorly designed APIs easier. I also understand that reasonable people differ on this issue. | ||||||||
|