...
(assuming I understand this, which is an if, a small if, but an if nonetheless)
Part A
...
We can implement methods directly on shared reference types themselves. There is no deref coercion then when called on a shared reference that is of that shared reference type (playground)
...
Note how the implementation is for the ref string slice type, not the primitive string slice type.
Part B
...
Consider two traits
From<String>
From<&'a static str>
The enum Cow<'astatic, str> implements both traits
Cow has the associated function
fn from(s: String) → Cow<'astatic, str>
Cow has another associated function
fn from(s: &'a static str) → Cow<'static, str>
Consider another trait
Into<Cow<'static, str>>
A From implementation implies that there is a
, str>Therefore String implements<
Consider the additional trait
Into<Cow<'a, str>>
corresponding Into implementation. There is a blanket implementation of Into in the standard library. My guess is that the following code is the blanket implementation
Code Block language rust impl<T,U> Into<U> for T where U: From<T> { fn into(self) -> U { U::from(self) } }
Therefore String implements the Into<Cow<'static,str>> trait
Code Block language rust impl Into<Cow<'static, str>> for String { fn into(self) -> Cow<'static, str> { ... } }
Consider the additional trait
String automatically implements Into, as does str, given that the From traits are implemented
Both String and str implement Into with a method of the following form
fn into(self) → Cow<a', str>
In the first four arms of the match expression, there are string literals upon which the method into() is called. We know the methods must have a return type of Cow<'static, str>.
A string literal is of type &str, a shared reference to a string slice.
When applying the method into(), the string literal is dereferenced into a string slice str
Then the method into() can be applied on the str. We have already seen that this method exists.