Having func1 call func2 is like promising me you'll just borrow my class notes for a quick read and then passing it to a friend who then runs off and keeps them. This is equivalent to making your friend promise to give back the notes to you.
So what I though is that I could return a reference to the map so that it's still owned by the struct. However, if the Child objects were large, it seems like this could be very inefficient.
With the current signature, the designer of do_something seeks ownership of value, and we have to provide it while remaining within the safety assurances of Rust. You can explore smart pointers as a potential solution.
Again, more avenues may be available depending on the actual implementation details of do_something. Wrap your value in Option
Making statements based on opinion; back them up with references or personal experience. I can provide full code on request.
Depending on your needs, one solution is to make root_reducer also take its argument by value. Another is to add a Clone bound to T, so you can create a new State when you need to pass it by value, like: help_function(state.clone()).
The second option could be done by implementing the Clone trait for the State type, like: So, the redux_rs library requires your functions to follow a certain interface.
And on all the tests where I need to pass in a closure to one of the fat ends: Redux_rs does not give reduces exclusive (smut T) access to the actions, so they won’t be able to call Input closures.
You’ll need to change the closure to implement the FN trait, which means it must work with only shared (at) access to its environment. You can do this by using shared mutable types like Cell and Recall for anything that gets mutated inside a reducer.
Here's a complete file with some more changes that I needed to get the tests to run: Show original The main additional change was adding a lifetime parameter to Action so that it is allowed to capture references to local variables, like quit_mock_called.
You'll notice that I also removed the type parameter from Action, and instead made it always use Box
But if you end up needing to make it generic again, it is possible, but will require adding a type annotations in a lot more places. Rust's ownership and borrowing system involves the use of references to operate on borrowed data, and the type system distinguishes two different fundamental reference types.
These names are fine and reasonably intuitive for Rust beginners, but this article lays out the motivation for preferring the names shared reference and “exclusive reference as you grow beyond the beginner stage and get into library design and some more advanced aspects of the language. Sooner or later you will encounter a library signature that flatly contradicts the beginner's mental model of Rust references.
But the fact that AtomicU32::store takes self by immutable reference should feel deeply uncomfortable under the beginner's mental model. For former C++ programmers it calls to mind certain abuses of coast_cast in C++, where maybe the author was never really sure whether they were violating some esoteric language law that would break the behavior of the code later on, even if it currently appears to work.
It turns out to be the beginner's understanding of what the Rust & and smut reference types mean. This time it should feel totally natural that this function takes the atomic u32 by shared reference.
The whole point of atomic is allowing concurrent loads and stores without inducing a data race. If the library refused to allow other references to exist during the call to store, there would hardly be a point to doing it atomically.
But via atomic or other forms of interior mutability discussed below, mutating through a shared reference can be safe too. As far as a beginner would be concerned, ability to mutate will be the most significant practical difference between the two reference types.
A good time to link someone to this page is when they are first surprised or confused by some library function taking & when they would expect it to require smut. The term for safe APIs that support mutation through a shared reference in Rust is “interior mutability”.
I used AtomicU32 as an example above because I find that it evokes the most striking rift between deeply-uncomfortable and totally-natural as you shift from the beginner's mental model to the correct one. While atomic are an important building block for multi threaded code, interior mutability is equally relevant on a single thread as well.
The standard library type Unsafely
And within the one thread, dynamically checked borrow rules will detect and prevent attempts to mutate while a reader is holding a reference into the content of the Recall. Only one of the references may operate on the inner T at a time, whether reading or writing; other accesses will block until the current one has released its lock.
If you’ve read our article on Rust ’s Ownership or if you’ve written your first few programs and wondered what’s the difference between String and STR, you’re most likely aware that there’s the notion of references in Rust. References to enable us to give things like functions a data structures access to values, without transferring ownership.
Here’s roughly what it looks like in memory (if “stack” and “heap” are terms that don’t make sense to you, you should really have a look at our article on Ownership in Rust : References can point to values anywhere in memory, not just the stack frame.
So for example name in the following code is a reference to a STR that lives in reallocated memory as part of the program: Rust is very clear about the issue and tells us to make up mutable using the but keyword.
If we try to compile this code, Rust will emit this error: While it may occur unexpected, it actually makes perfect sense.
References can be referenced using the * -operator, so one can access their underlying value in memory. In fact, if make those changes to the code it compiles and runs as expected.
What we’re experiencing here is another usability feature of the Rust compiler. For example, an array’s sort() method needs a smut self.
If there’s one more thing that should be talked about when it comes to references in Rust, it’s probably its safety and lifetime characteristics.