How to define / edit a struct istance field with a method? - eviltoast

Let’s say I have a struct Event which implements the method permalink:

struct Event {
    base_url: String,
    rel_permalink: String,
    permalink: String,
    title: String,
}

impl Event {
    fn permalink(&self) -> String {
        let permalink = format!("{}{}", self.base_url, self.rel_permalink);
        permalink
    }
}

The method takes 2 fields of the struct and the target would be to return the definition of another field.

Later I instantiate an event1: Event:

let event1 = Event {
                base_url: base_url,
                rel_permalink: rel_permalink.to_string(),
                title: node.value().name().to_string(),
                permalink = permalink(),
            };

Essentially I would like the field permalink to be the value returned by the method permalink, is something like this possible, is this correct? I couldn’t find something similar in the docs…

Pheraps using an associated function as constructor would be a better way to handle a similar situation?

Thank you so much!

  • Ephera@lemmy.ml
    link
    fedilink
    arrow-up
    3
    ·
    edit-2
    5 days ago

    Hmm, yeah, I’d use a constructor method:

    impl Event {
        pub fn new(base_url: String, rel_permalink: String, title: String) -> Self {
            let permalink = format!("{}{}", self.base_url, self.rel_permalink);
    
            Self {
                    base_url,
                    rel_permalink,
                    title,
                    permalink,
             };
        }
    
        // ...
    }
    

    Then you’d instantiate it like so:

    let title = node.value().name().to_string();
    let event = Event::new(base_url, rel_permalink.to_string(), title);
    
    • GissaMittJobb@lemmy.ml
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      5 days ago

      Is it really valid to call permalink() in that context, since it requires &self? There’s no self in that context afaik. Can’t test it now but it looks suspicious

      EDIT: Invalid since the comment was updated