&gt; Those languages used to introduce mutable wrappers and not a &quot;to_string()&quot; method.<p>Yes! This is similar to, say, StringBuilder in Java. The difference is that ownership is intertwined with the type here. Strings are always owned, and as such you can choose to mutate them. String slices (references) are not owned by you (you borrow them), so you can&#x27;t do anything that would be memory unsafe. You can borrow a mutable slice of the String (like a reference to the backing array), which you can alter in-place but you cannot do anything that would require reallocation (Strings being growable was mentioned earlier -- mutable slices are not). Slices which come from string literals are always immutable.<p>For probably-obvious reasons you can only take one mutable reference at once, while you can have as many immutable references as you like. Taking a mutable reference also prevents you taking any immutable references at the same time: <a href="https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;references-and-borrowing.html#the-rules" rel="nofollow">https:&#x2F;&#x2F;doc.rust-lang.org&#x2F;book&#x2F;references-and-borrowing.html...</a><p>In my own experience this takes a bit of time to get used to, and in some cases the rules are still quite frustrating. People with more experience of the language report that they get used to it, though.<p>&gt; Is that similar to the dynamics of uniqueness types?<p>I believe it&#x27;s similar, but I&#x27;m not super-familiar with uniqueness types. This SO answer looks good: <a href="http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;26309081&#x2F;how-do-rusts-ownership-semantics-relate-to-uniqueness-typing-as-found-in-clean" rel="nofollow">http:&#x2F;&#x2F;stackoverflow.com&#x2F;questions&#x2F;26309081&#x2F;how-do-rusts-own...</a>