简体   繁体   English

如何解决此代码中的生命周期问题?

[英]How do I resolve the lifetime issues in this code?

pub struct Map<'a, F, I, O>
    where F: Fn(I) -> O {
    parser: &'a Parser<'a>,
    mapper: F,
    phantomDataI: PhantomData<I>,
    phantomDataO: PhantomData<O>
}

impl<'a, F, I, O> Map<'a, F, I, O> 
    where F: Fn(I) -> O {
    fn new(parser: &'a Parser, mapper: F) -> Map<'a, F, I, O> {
        Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
    }        
}

When I compile this I get an error...当我编译这个时,我收到一个错误...

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
    --> src\combinator\mod.rs:123:9
    |
123 |         Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
    |         ^^^
    |
note: first, the lifetime cannot outlive the lifetime 'a as defined on the impl at 120:1...
--> src\combinator\mod.rs:120:1
    |
120 | / impl<'a, F, I, O> Map<'a, F, I, O>
121 | |     where F: Fn(I) -> O {
122 | |     fn new(parser: &'a Parser, mapper: F) -> Map<'a, F, I, O> {
123 | |         Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
124 | |     }
125 | | }
    | |_^
note: ...so that expression is assignable (expected combinator::Map<'a, _, _, _>, found combinator::Map<'_, _, _, _>)
--> src\combinator\mod.rs:123:9
    |
123 |         Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: but, the lifetime must be valid for the anonymous lifetime #1 defined on the method body at 122:5...
--> src\combinator\mod.rs:122:5
    |
122 | /     fn new(parser: &'a Parser, mapper: F) -> Map<'a, F, I, O> {
123 | |         Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
124 | |     }
    | |_____^
note: ...so that types are compatible (expected combinator::Parser<'_>, found combinator::Parser<'_>)
--> src\combinator\mod.rs:123:15
    |
123 |         Map { parser, mapper, phantomDataI: PhantomData, phantomDataO: PhantomData }
    |               ^^^^^^

I don't understand why this line is occuring我不明白为什么会出现这条线

expression is assignable (expected combinator::Map<'a, _, _, _>, found combinator::Map<'_, _, _, _>)

Do I need to change my lifetime specifiers somehow?我是否需要以某种方式更改我的生命周期说明符?

new签名中的Parser需要'a生命周期参数:

fn new(parser: &'a Parser<'a>, mapper: F) -> Map<'a, F, I, O>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM