为什么我不能调用我的功能?

时间:2014-05-31 00:26:25

标签: rust

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

无论我尝试什么,我似乎都无法调用它(请参阅我在代码中尝试失败的编译器消息)。

1 个答案:

答案 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}}