Ошибка владения при использовании шаблона построителя

Я попытался написать API, следуя шаблону Builder, пример намного упрощен, но все же компилятор жалуется, что заемное значение не живет достаточно долго.

#[derive(Debug)]
pub struct MediaType {
    toptype: Option<String>,
    subtype: Option<String>,
}

impl MediaType {
    pub fn new() -> MediaType {
        MediaType {
            toptype: None,
            subtype: None,
        }
    }

    pub fn toptype<'a>(&'a mut self, toptype: Option<String>) -> &'a mut MediaType {
        self.toptype = toptype;
        self
    }
    pub fn subtype<'a>(&'a mut self, subtype: Option<String>) -> &'a mut MediaType {
        self.subtype = subtype;
        self
    }
}


fn main() {
    let mut tag =  MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));
    println!("{:?}", tag);
}

Полученное сообщение об ошибке:

<anon>:27:20: 27:36 error: borrowed value does not live long enough
<anon>:27     let mut tag =  MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));
                             ^~~~~~~~~~~~~~~~
<anon>:27:103: 29:2 note: reference must be valid for the block suffix following statement 0 at 27:102...
<anon>:27     let mut tag =  MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));
<anon>:28     println!("{:?}", tag);
<anon>:29 }
<anon>:27:5: 27:103 note: ...but borrowed value is only valid for the statement at 27:4
<anon>:27     let mut tag =  MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<anon>:27:5: 27:103 help: consider using a `let` binding to increase its lifetime
<anon>:27     let mut tag =  MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));
              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to previous error
playpen: application terminated with error code 101

оба используют два вкладыша

let mut tag = MediaType::new();
tag.toptype(Some("text".to_owned())).subtype(Some("html".to_owned()));

и непосредственно печать MediaType

println!("{:?}", MediaType::new().toptype(Some("text".to_owned())).subtype(Some("html".to_owned())));

Выполнять работу. Почему средство проверки заимствования жалуется, хотя оно не жалуется при непосредственном использовании значения, и я следовал примеру шаблона построителя?

Игровая площадка Rust


person Pyfisch    schedule 21.08.2015    source источник


Ответы (1)


Потому что вы нигде не храните конструктор. Если он нигде не хранится, он существует не более чем на время действия этого выражения. Итак, в конце выражения у вас есть &mut MediaType, указывающий на значение, которое вот-вот будет уничтожено.

Если вы посмотрите на пример в связанном документе, автор либо полностью использует построитель в одном выражении, либо, он сохраняет результат вызова ::new(). Вы не можете заимствовать временно, а затем сохранить это заимствование.

person DK.    schedule 21.08.2015