Comment by chrismorgan
14 hours ago
For more technical precision in Rust (not because it actually changes anything), += will use AddAssign rather than Add, if it’s implemented, which mutates in-place, whereas `a = a + b` would move twice (though in a way that will always optimise to the same thing). This means you’re actually invoking
impl AddAssign<&str> for String {
#[inline]
fn add_assign(&mut self, other: &str) {
self.push_str(other);
}
}
which the doc comment notes “has the same behavior as the `push_str` method”.
And this shows yet another option: add a separate overload for +=. Python does actually have that in the form of the __iadd__ magic method, and I presume CPython’s optimisation could be implemented that way, though it doesn’t look to be (and this might not have quite the same semantics, I’m not sure):
class str:
def __iadd__(self, other):
if sys.getrefcount(self) == probably 2, it’s fiddly:
mutate self
raise NotImplemented
No comments yet
Contribute on Hacker News ↗