Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

A helpful resource for better understanding the Cow enum is The Secret Life of Cows. Be sure to click on the “playground” links in the discussion there on the serde crate.


Step-by-step, how to understand the describe() function example

(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)

In a sense then the method implemented, when called on a shared reference, takes ownership of the shared reference, per se, not the value the shared reference points to.

use std::borrow::Cow;

trait CustomInto<T> {
    fn custom_into(self) -> T;
}

impl<'a> CustomInto<Cow<'a, str>> for &'a str {
    fn custom_into(self) -> Cow<'a, str> {
        Cow::Borrowed(self)
    }
}

fn main(){
    let _cow = "hello there".custom_into();    
}

Note how the implementation is for the ref string slice type, not the primitive string slice type.

Part B

  1. Consider two traits

    1. From<String>

    2. From<&'static str>

  2. The enum Cow<'static, str> implements both traits

    1. Cow has the associated function
      fn from(s: String) → Cow<'static, str>

    2. Cow has another associated function
      fn from(s: &'static str) → Cow<'static, str>

  3. Consider another trait

    1. Into<Cow<'static, str>>

  4. A From implementation implies that there is a 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

    impl<T,U> Into<U> for T
       where U: From<T> {
       
      fn into(self) -> U {
        U::from(self)
      }  
    }
  5. Therefore String implements the Into<Cow<'static,str>> trait

    impl Into<Cow<'static, str>> for String {
      fn into(self) -> Cow<'static, str> {
        ...
      }
    }

  1. Consider the additional trait

  2. String automatically implements Into, as does str, given that the From traits are implemented

  3. Both String and str implement Into with a method of the following form

    1. fn into(self) → Cow<a', str>

  4. 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>.

  5. A string literal is of type &str, a shared reference to a string slice.

  6. When applying the method into(), the string literal is dereferenced into a string slice str

  7. Then the method into() can be applied on the str. We have already seen that this method exists.

  • No labels