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
。
无论我尝试什么,我似乎都无法调用它(请参阅我在代码中尝试失败的编译器消息)。
答案 0 :(得分:2)
问题是Option.unwrap
的签名:
impl Option<T> {
fn unwrap(self) -> T { ... }
}
也就是说,它取值为Option
。由RequestHandler
移动时,StrBuf
必须移动StrBuf
移动(特别是RequestHandler
不是Copy
,迫使Copy
也不是impl Option<T> {
fn unwrap<'r>(&'r self) -> Option<&'r T> { ... }
}
})。
处理此问题的正确方法是致电Option.as_ref
:
Option
也就是说,它会引用Option
,并为您提供Option
,其中包含对原始.unwrap
所包含内容的引用,这意味着RequestHandler
将会给你那个引用,指向self
里面的(self.requesthandler.as_ref().unwrap().handler)()
,按你的意愿处理。
{{1}}