Module show_notes::e016
source · Expand description
RefCell
s and code smells
- Date: July 23, 2016
- Subject: Digging deeper on smart pointers and mutability with
Cell
andRefCell
. - Audio
§Notes
What are the Cell
and RefCell
types, and when should we use them?
Today, we follow up both the detailed discussion of smart pointers in e015 and the closely related discussion in Interview 2 with Raph Levien, and look at two types you need to have a good idea how to deal with if you want to use these smart pointer types more ergonomically—that is, how to use them without feeling like you’re beating your head against a wall!
The descriptions of the code below are minimal; see the inline comments in the source for the actual informative discussion.
§A comment on the code samples
Note that in several cases below we use &[]
to borrow a reference to a
slice, rather than requiring this to pass a reference to a Vec
specifically. Making the first argument be of type
&Vec<RefCell<SimpleNonCopyable>>
would also work, but would be more
restrictive in what it could and couldn’t accept. Since Vec
implements
Deref
to automatically convert to slices, this works just fine, and is
more general. This is how you should usually write function signatures which
operate on reference to vectors (and likewise for other types which can
dereference to slices). We’ll talk about this more in a future episode!
§Links
- Rust 1.10
- blog post
- full release notes
- cdylib
- RFC: text | discussion
- implementation
- rustup 0.3.0 release
- Integer32 (Carol Nichols’ and Jake Goulding’s new Rust consultancy)
- IntelliJ Rust
- Tango: source | talk
Cell
andRefCell
:- Cell Types in The Rust Programming Language
- Standard library:
std::cell
module docs (detailed explanation, complementary to the book)Cell<T>
docs (atstd::cell::Cell
)RefCell<T>
docs (atstc::cell::RefCell
)
§Sponsors
- Aleksey Pirogov
- Chris Palmer
- Daniel Collin
- Derek Morr
- Doug Reeves
- Eric Fulmer
- Hamza Sheikh
- Jakub “Limeth” Hlusička
- Keith Gray
- Lachlan Collins
- Leif Arne Storset
- Luca Schmid
- Micael Bergeron
- Michael Clayton
- Pascal Hertleif
- Ralph Giles (“rillian”)
- Ralph “FriarTech” Loizzo
- Raph Levien
- reddraggone9
- Ryan Ollos
- Vesa Kaihlavirta
- William Roe
(Thanks to the couple people donating who opted out of the reward tier, as well. You know who you are!)
§Become a sponsor
§Contact
- New Rustacean:
- Twitter: @newrustacean
- Email: hello@newrustacean.com
- Chris Krycho
- GitHub: chriskrycho
- Twitter: @chriskrycho
Structs§
- A container showing a type where
Cell<T>
works withVec<T>
. - A container showing where
Cell<T>
doesn’t work andRefCell<T>
does.
Functions§
- Demonstrate interior mutability with
Rc
andRefCell
. - Demonstrate how you need
Cell<T>
even just with aVec<T>
; - Operate mutably on the contenets of an immutable reference to a
Vec
.