mirror of https://github.com/sunface/rust-course
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1.4 KiB
1.4 KiB
Eq
The rules for == and friends in Rust are a bit complicated. Consider some type T that implements Eq:
- You can always compare objects of type T. The comparison will be notionally done as if by reference, meaning there will be no move or copy involved.
- You can always compare references to objects of type T. The objects must match in "reference depth": &&a == &&a is OK, &a == &&a is not. Dereferences count here: &&&a == &&&a is OK.
- Some types — for example, String — have a Deref implementation. This will play a role in comparisons because they are "auto-derefed". For example, if s is a String then s == "x" is OK, because s will automatically be treated as &str for comparison purposes.
In general, you can't dereference a string literal. A string literal is of type &'static str
. If you dereference it you get a str, which is unsized and thus really hard to work with.
However, ==
and friends are special. From the Rust Reference Manual:
Unlike the arithmetic and logical operators above, these operators implicitly take shared borrows of their operands, evaluating them in place expression context:
a == b;
// is equivalent to
::std::cmp::PartialEq::eq(&a, &b);
This means that the operands don't have to be moved out of. So when you write
*"s" == *"t"
it is treated as
::std::cmp::PartialEq::eq(&*"s", &*"t");
and thus works even though it looks like it shouldn't.