-
Notifications
You must be signed in to change notification settings - Fork 12.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
String::truncate() and Vec::truncate() are inconsistent if new_len > current length #32717
Comments
Looking at the source, I have a feeling the panic-on-greater-than isn't a deliberate decision. Since it simply asserts that the new length is a character boundary (and presumably "not in the string isn't a valid boundary"). I think adding a panic could be considered a breaking change, but removing one doesn't seem like it should be. |
@Aatch getting rid of a panic is just as bad if not worse: unsafe {
s.truncate(10); // panics if s isn't long enough.
s.as_mut_vec().as_mut_ptr() = b"1234567890";
} This is obviously a stupid example but you get the point. |
Ignoring the panics seems an ok solution to me. |
This was discussed at libs triage and the decision was that this is indeed an inconsistency we'd like to fix and the window for fixing still seems open as the code this would break seems almost too niche to exist. I've submitted a PR for this. |
The `Vec::truncate` method does not panic if the length argument is greater than the vector's current length, but `String::truncate` will indeed panic. This semantic difference can be a bit jarring (e.g. rust-lang#32717), and after some discussion the libs team concluded that although this can technically be a breaking change it is almost undoubtedly not so in practice. This commit changes the semantics of `String::truncate` to be a noop if `new_len` is greater than the length of the current string. Closes rust-lang#32717
std: Change String::truncate to panic less The `Vec::truncate` method does not panic if the length argument is greater than the vector's current length, but `String::truncate` will indeed panic. This semantic difference can be a bit jarring (e.g. #32717), and after some discussion the libs team concluded that although this can technically be a breaking change it is almost undoubtedly not so in practice. This commit changes the semantics of `String::truncate` to be a noop if `new_len` is greater than the length of the current string. Closes #32717
String::truncate specifies that it "panics if
new_len
> current length"Vec::truncate specifies that "If
len
is greater than the vector's current length, this has no effect.This seems very inconsistent. I would personally prefer Vec's semantics. I'm not sure if it's a breaking change to add/remove a documented panic, and I fear it's not okay, but it feels very inconsistent.
The text was updated successfully, but these errors were encountered: