2014-05-31 4 views
1
struct Floor{ 
    requestHandler: Option<RequestHandler> 
} 

struct RequestHandler{ 
    uri: StrBuf, 
    handler: fn() -> StrBuf 
} 

impl Floor { 

    fn do_something(&self){ 
     //(&self.requestHandler.unwrap().handler)(); 
     //expected function but found `&fn() -> std::strbuf::StrBuf` 

     //(*(&self.requestHandler.unwrap().handler))(); 
     //cannot move out of dereference of `&`-pointer 

     //(self.requestHandler.unwrap().handler)(); 
     //cannot move out of dereference of `&`-pointer 
    } 
} 

fn main() { 

    let foo = Floor { 
     requestHandler: None 
    }; 

    foo.do_something(); 
} 

В do_something я стараюсь, чтобы добраться до моего fn, который хранится на handler свойство моей RequestHandler структуры.Почему я не могу назвать свою функцию?

Независимо от того, что я пытаюсь, я просто не могу его назвать (см. Сообщения компилятора под моими неудачными попытками в коде).

ответ

2

Проблема заключается подпись Option.unwrap:

impl Option<T> { 
    fn unwrap(self) -> T { ... } 
} 

То есть, он принимает Option по значению. RequestHandler должен перемещаться при использовании по значению, так как StrBuf ходов (в частности StrBuf не Copy, который заставляет RequestHandler также не быть Copy).

Правильный способ справиться с этим, чтобы позвонить Option.as_ref:

impl Option<T> { 
    fn unwrap<'r>(&'r self) -> Option<&'r T> { ... } 
} 

То есть, он принимает ссылку на Option и дает вам Option, содержащей ссылку на то, что содержал оригинальный Option, это означает, что .unwrap затем предоставит вам эту ссылку, указывая на RequestHandler внутри self, чтобы обращаться по вашему желанию.

(self.requesthandler.as_ref().unwrap().handler)() 
+0

Благодарим за ответ! Можете ли вы объяснить, что мешает ему переместить 'RequestHandler'? Зачем нам нужна ссылка? Не может ли он просто переместить его, если это необходимо? Это может показаться очень глупым, но я пытаюсь получить более глубокое понимание всего этого стека, кучи, указателя, ссылок. – Christoph

+0

У меня нет времени на полный ответ, но в учебнике несколько излагаются эти идеи ([разделы с 9 по 11] (http://doc.rust-lang.org/master/tutorial.html#ownership)) и Николас Мацакис [недавняя «гарантия безопасности памяти в ржавчине»] (https://air.mozilla.org/guaranteeing-memory-safety-in-rust/) касается заимствования и владения. – huon

+0

Да, я читал это несколько раз и также смотрел это видео. Я понимаю это теоретически, но пока не могу применить его ко всем моим собственным примерам. В эти дни мне хотелось бы лучше понять C/C++. Было бы очень полезно при изучении Rust. – Christoph

Смежные вопросы