Pausing and resuming the song
We'll start by adding a field indicating whether the player is in pause or not. This field will be changed by methods such as play
or resume
. However, remember that our Playlist
is wrapped in an Rc
, so that we can use it in different places, namely in the event handlers. Also, remember that Rust forbids mutation when there are mutable references to a value. How can we update this field while still using a reference-counted pointer? One way is to use interior mutability.
Interior mutability
Interior mutability is a concept granting mutable an inner value of a type with an immutable reference. Is this safe to do? Yes, totally, because we need to respect certain constraints. One way to have interior mutability is to wrap our Cell
type. The constraint of this type is that if we want to get the value from the Cell
from an immutable reference, the wrapped type must implement the Copy
trait. We'll see the other commonly-used type for interior mutability later in this...