【问题标题】:Lifetime parameters for an enum within a struct结构中枚举的生命周期参数
【发布时间】:2015-06-11 16:04:54
【问题描述】:

我不明白为什么这种结构会出错

enum Cell <'a> {
    Str(&'a str),
    Double(&'a f32),
}

struct MyCellRep<'a> {
    value: &'a Cell,
    ptr: *const u8,
}

impl MyCellRep{
    fn new_from_str(s: &str) {
        MyCellRep { value: Cell::Str(&s), ptr: new_sCell(CString::new(&s)) }
    }

    fn new_from_double(d: &f32) {
        MyCellRep { value: Cell::Double(&d), ptr: new_dCell(&d) }
    }
}

我得到了错误

14:22 error: wrong number of lifetime parameters: expected 1, found 0 [E0107]
src\lib.rs:14     value : & 'a Cell ,

所以我也尝试了

struct MyCellRep<'a> {
    value: &'a Cell + 'a,
    ptr: *const u8,
}

但是得到了

14:22 error: expected a path on the left-hand side of `+`, not `&'a Cell`

我认为Cell 应该具有MyCellRep 的生命周期,而Cell::StrCell::Double 至少应该具有Cell 的生命周期。

最终我能做的就是说

let x = MyCellRef::new_from_str("foo");
let y = MyCellRef::new_from_double(123.0);

更新 我想补充一点,通过更改 Cell 定义,其余代码也应更改为以下内容,以供其他人搜索答案。

pub enum Cell<'a> {
    Str(&'a str),
    Double(&'a f32),
}


struct MyCellRep<'a> {
    value: Cell<'a>, // Ref to enum 
    ptr: *const u8, // Pointer to c struct
}

impl<'a>  MyCellRep<'a> {
    fn from_str(s: &'a str) -> DbaxCell<'a> {
        MyCellRep { value: Cell::Str(&s) , ptr: unsafe { new_sCell(CString::new(s).unwrap()) } }
    }

    fn from_double(d: &'a f32) -> DbaxCell {
        MyCellRep{ value: Cell::Double(&d) , ptr: unsafe { new_dCell(*d) } }
    }
}

我喜欢 Rust 的地方就像 OCaml,如果它编译它就可以工作:)

【问题讨论】:

    标签: struct enums rust lifetime


    【解决方案1】:

    您(可以理解)误解了错误消息:

    14:22 error: wrong number of lifetime parameters: expected 1, found 0 [E0107]
    src\lib.rs:14     value : & 'a Cell ,
    

    您认为“但我提供了生命周期参数!它是'a!”但是,编译器试图告诉您您没有提供生命周期参数 for Cell(不是对它的引用):

    Cell<'a>
    

    【讨论】:

    • (回答您已删除的评论):我会尝试在结构中将 value: &amp;'a Cell 替换为 value: Cell&lt;'a&gt;,但我不能 100% 确定这就是您想要的。如果它编译,它可能是你想要的,不过。更复杂(但更强大)的是value: &amp;'a Cell&lt;'b&gt;,其中'b 在结构参数中声明:MyCellRep&lt;'a, 'b&gt;
    • 是的,我做了你第一次改变并最终得到了 Cell,然后,是的,第二个 MyCellRep 直观地变成了我想要的。
    【解决方案2】:

    mdup is correct,但错误消息可以帮助您。由于某种原因,许多人忽略了错误消息中指向错误的部分

    <anon>:7:16: 7:20 error: wrong number of lifetime parameters: expected 1, found 0 [E0107]
    <anon>:7     value: &'a Cell,
                            ^~~~
    

    有时,我想提交一个 PR,让 ^~~~~ 在终端中闪烁 ^_^。

    【讨论】:

    • 公平地说,箭头指向类型的左侧,难怪人们想要更正引用而不是(看不见的)类型参数:)
    • @mdup 但箭头突出有问题的问题,而不仅仅是一个点。也就是说,^~ 都很重要。我真的很想弄清楚如何改进这个用户体验。
    • 同意。也许^~~~指定的部分也可以通过更改术语背景颜色来突出显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多