> <i>Normally, Rust would complain,</i><p>Not in the example given. There's nothing wrong with creating an Rc<T> loop; the borrow checker doesn't come into the picture.<p>> <i>That is, you could mutate the data within an Rc as long as the data is cheap to copy. You can achieve this by wrapping your data within a Rc<Cell<T>>.</i><p>T: Copy is only a bound on the .get() method. You can do this even if the data is expensive to copy, so long as you always swap in a valid representation of T. (I sometimes write Cell<Option<T>>, where it makes sense to replace with a None value.)<p>> <i>Embrace unsafe as long as you can prove the soundness of your API,</i><p>In other words: avoid unsafe except as a last-ditch resort.<p>> <i>&impl Meower</i><p>Should be impl Meower, if you want the same behaviour as the explicit-generic version.<p>> <i>Many tutorials immediately jump to iterating over vectors using the into_iter method</i><p>Out of interest, what tutorials? I've never read one that does that!<p>> <i>Instead, there are two other useful methods on iterators</i><p>Methods on many iterables in std. Not on iterators (nor iterables in general).<p>> <i>You can wrap the following types with PhantomData and use them in your structs as a way to tell the compiler that your struct is neither Send nor Sync.</i><p>… You're doing it wrong. €30 says your unsafe code is unsound.<p>> <i>Embrace the monadic nature of Option and Result types</i><p>Er, maybe? But try boring ol' pattern-matching first. It's usually clearer, outside examples like these ones (specially-chosen to make the helper methods shine). I'd go for if let, in this example – though if the function really just returns None in the failure case, go with the ? operator.<p>> <i>For example, writing a custom linked list, or writing structs that use channels, would typically need to implement a custom version of Drop.</i><p>No, you don't typically need to. Rust provides an automatic implementation that <i>probably</i> does what you need already. Custom drop implementations are mainly useful for unsafe code.<p>> <i>Really annoyed by the borrow checker? Use immutable data structures</i><p>No. <i>No.</i> Haskell has all sorts of optimisations to make "immutable everything" work, and Rust's "do what I say" nature means none of those can be applied by the compiler. If you want to program this way, pick a better language.<p>> <i>Instead, you can define a blanket trait that can make your code a more DRY.</i><p>There are no blanket <i>traits</i>. There are blanket trait <i>implementations</i>, and you've missed that line from your example.<p>All in all, this is a good article. There are some good tips in there, but I wouldn't recommend it to a beginner. I <i>would</i> recommend the author revisit it in a few months, and make some improvements: a tutorial <i>designed</i> when you're green, but with the <i>experience</i> from your older self, can be a really useful thing.