-
Notifications
You must be signed in to change notification settings - Fork 13.2k
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
Remove unnecessary as[_mut]_slice
/to_string()
calls
#19378
Conversation
|
||
impl<'a, A, B> PartialEq<Vec<B>> for &'a [A] where A: PartialEq<B> { | ||
#[inline] | ||
fn eq(&self, other: &Vec<B>) -> bool { PartialEq::eq(*self, &**other) } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you explain why the impls above and below compare &**self
, whereas this only compares *self
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These three implementations merely defer their job to the impl PartialEq<[B]> for [A]
one, where the signature of eq
is fn eq(&Self = &[A], &[B])
. The *self
vs &**self
is just about playing the deref game:
- In this case
self
has type&&[A]
so*self
has type&[A]
- In case above,
self
has type&Vec<A>
,*self
has typeVec<A>
, and the next*
actually triggersDeref<[A]>
, so&**self
has type&[A]
. - In case below,
self
has type&&mut [A]
,*self has type "
&mut [A]" (yes, I know the compiler won't actually let you do that), and the next
&*is a "explicit immutable reborrow" to get
&[A]`.
Equivalently, I could have written &**self
in all these three cases.
Hey! I've been offline for Thanksgiving but just got back to #19167. Hopefully we can move this through quickly. |
@alexcrichton just a heads-up, #19167 has been approved. |
@alexcrichton rebased, and tested. |
4ae48bd
to
f569d5c
Compare
Now that we have an overloaded comparison (`==`) operator, and that `Vec`/`String` deref to `[T]`/`str` on method calls, many `as_slice()`/`as_mut_slice()`/`to_string()` calls have become redundant. This patch removes them. These were the most common patterns: - `assert_eq(test_output.as_slice(), "ground truth")` -> `assert_eq(test_output, "ground truth")` - `assert_eq(test_output, "ground truth".to_string())` -> `assert_eq(test_output, "ground truth")` - `vec.as_mut_slice().sort()` -> `vec.sort()` - `vec.as_slice().slice(from, to)` -> `vec.slice(from_to)` --- Note that e.g. `a_string.push_str(b_string.as_slice())` has been left untouched in this PR, since we first need to settle down whether we want to favor the `&*b_string` or the `b_string[]` notation. This is rebased on top of #19167 cc @alexcrichton @aturon
Now that we have an overloaded comparison (`==`) operator, and that `Vec`/`String` deref to `[T]`/`str` on method calls, many `as_slice()`/`as_mut_slice()`/`to_string()` calls have become redundant. This patch removes them. These were the most common patterns: - `assert_eq(test_output.as_slice(), "ground truth")` -> `assert_eq(test_output, "ground truth")` - `assert_eq(test_output, "ground truth".to_string())` -> `assert_eq(test_output, "ground truth")` - `vec.as_mut_slice().sort()` -> `vec.sort()` - `vec.as_slice().slice(from, to)` -> `vec.slice(from_to)` --- Note that e.g. `a_string.push_str(b_string.as_slice())` has been left untouched in this PR, since we first need to settle down whether we want to favor the `&*b_string` or the `b_string[]` notation. This is rebased on top of #19167 cc @alexcrichton @aturon
Ahh, sorry, a recent PR modified an existing test, and I missed that change during my last rebase. I've now amended my mistake and |
😢 A syntax error on the android tests, which didn't get parsed when I ran |
Now that we have an overloaded comparison (`==`) operator, and that `Vec`/`String` deref to `[T]`/`str` on method calls, many `as_slice()`/`as_mut_slice()`/`to_string()` calls have become redundant. This patch removes them. These were the most common patterns: - `assert_eq(test_output.as_slice(), "ground truth")` -> `assert_eq(test_output, "ground truth")` - `assert_eq(test_output, "ground truth".to_string())` -> `assert_eq(test_output, "ground truth")` - `vec.as_mut_slice().sort()` -> `vec.sort()` - `vec.as_slice().slice(from, to)` -> `vec.slice(from_to)` --- Note that e.g. `a_string.push_str(b_string.as_slice())` has been left untouched in this PR, since we first need to settle down whether we want to favor the `&*b_string` or the `b_string[]` notation. This is rebased on top of #19167 cc @alexcrichton @aturon
Now that we have an overloaded comparison (
==
) operator, and thatVec
/String
deref to[T]
/str
on method calls, manyas_slice()
/as_mut_slice()
/to_string()
calls have become redundant. This patch removes them. These were the most common patterns:assert_eq(test_output.as_slice(), "ground truth")
->assert_eq(test_output, "ground truth")
assert_eq(test_output, "ground truth".to_string())
->assert_eq(test_output, "ground truth")
vec.as_mut_slice().sort()
->vec.sort()
vec.as_slice().slice(from, to)
->vec.slice(from_to)
Note that e.g.
a_string.push_str(b_string.as_slice())
has been left untouched in this PR, since we first need to settle down whether we want to favor the&*b_string
or theb_string[]
notation.This is rebased on top of #19167
cc @alexcrichton @aturon