如何将锈蚀的寿命结合起来?

道格

这段代码:

struct Foo<'a> {
  value: Option<&'a int>,
  parent: Option<&'a Foo<'a>>
}

impl<'a> Foo<'a> {
  fn bar<'a, 'b, 'c: 'a + 'b>(&'a self, other:&'b int) -> Foo<'c> {
    return Foo { value: Some(other), parent: Some(self) };
  }
}

fn main() {
  let e = 100i;
  {
    let f = Foo { value: None, parent: None };
    let g:Foo;
    {
       g = f.bar(&e);
    }
    // <--- g should be valid here
  }
  // 'a of f is now expired, so g should not be valid here.

  let f2 = Foo { value: None, parent: None };
  {
    let e2 = 100i;
    let g:Foo;
    {
       g = f2.bar(&e2);
    }
    // <--- g should be valid here
  }
  // 'b of e2 is now expired, so g should not be valid here.
}

无法编译错误:

<anon>:8:30: 8:35 error: cannot infer an appropriate lifetime due to conflicting requirements
<anon>:8     return Foo { value: Some(other), parent: Some(self) };
                                      ^~~~~
<anon>:7:3: 9:4 note: consider using an explicit lifetime parameter as shown: fn bar<'a, 'b>(&'a self, other: &'b int) -> Foo<'b>
<anon>:7   fn bar<'a, 'b, 'c: 'a + 'b>(&'a self, other:&'b int) -> Foo<'c> {
<anon>:8     return Foo { value: Some(other), parent: Some(self) };
<anon>:9   }

(游戏围栏:http//is.gd/vAvNFi

这显然是一个人为的例子,但这是我偶尔要做的。

所以...

1)如何结合生命?(即,返回寿命至少为'a或'b,以较短者为准的Foo)

2)是否有某种方法可以编写针对资产寿命编译失败的测试?(例如,尝试以错误的方式编译使用功能的#[test]并因生命周期错误而失败)

休恩

边界'c: 'a + 'b表示'c至少与'a和一样长'b然而,在这种情况下,该Foo值是有效的正是最短的'a'b:一旦作为参考值的数据背后去的范围之整个Foo必须被无效。(这是说,数据的有效期为'c在有效工会'a'b。)

用更具体的术语说'b = 'static,则'c: 'a + 'static意味着也'c必须为'static,因此返回值将为Foo<'static>这显然是不对的,因为它将把有限的'a self参考“升级”为永久的参考。

此处的正确行为是使用生命周期的交集:Foo仅当两个函数参数均有效时,才有效。相交操作只是用相同的名称标记引用:

fn bar<'a>(&'a self, other: &'a int) -> Foo<'a>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将 ramda 与重构结合起来?

来自分类Dev

如何将play框架和angular2结合起来?

来自分类Dev

如何将2种方式的数据绑定与模型驱动的表单结合起来?

来自分类Dev

Haskell:如何将标量值和单子值结合起来?

来自分类Dev

在Redshift中,如何将CTAS与“如果不存在”子句结合起来?

来自分类Dev

如何将Azure测试计划与管道结合起来?

来自分类Dev

如何将词汇表和语法结合起来?

来自分类Dev

Rust:如何将Entry API与拥有的数据结合起来?

来自分类Dev

如何将获胜者和工作组结合起来?

来自分类Dev

如何将这两种路线结合起来?

来自分类Dev

如何将导航栏和分页结合起来?

来自分类Dev

T-SQL:如何将多行代码与 if 语句结合起来

来自分类Dev

如何将 3 个选择器与 a:hover 标签结合起来?

来自分类Dev

如何将数据帧与熊猫中的冗余行结合起来

来自分类Dev

如何将 Join 与聚合函数和分组依据结合起来

来自分类Dev

如何将 var 与 var + repeat 结合起来?

来自分类Dev

如何将 NSLayout 约束与 CGrect 框架(Swift4)结合起来

来自分类Dev

如何将这两个 Less @Media 查询与“或”条件结合起来?

来自分类Dev

如何将数据切换与数据工具提示结合起来?

来自分类Dev

如何将延迟函数调用的顺序和并行执行结合起来?

来自分类Dev

如何将这两种方法结合起来?

来自分类Dev

rust-如何将这个宏与循环/递归结合起来?

来自分类Dev

如何将代码隐藏和 javascript 函数结合起来?

来自分类Dev

如何将两个字符串与随机位置结合起来

来自分类Dev

如何将Angular2与jinja2模板和烧瓶结合起来

来自分类Dev

如何将Cognito用户池与外部供应商(如Facebook)结合起来?

来自分类Dev

我的第一个R Shiny,如何将selectinput与renderplot(ggplot)结合起来?

来自分类Dev

如何将解析度与仅针对IE 11或更高版本的媒体查询结合起来?

来自分类Dev

如何将棉花糖数据类与棉花糖oneofschema结合起来以实现多态结构?

Related 相关文章

  1. 1

    如何将 ramda 与重构结合起来?

  2. 2

    如何将play框架和angular2结合起来?

  3. 3

    如何将2种方式的数据绑定与模型驱动的表单结合起来?

  4. 4

    Haskell:如何将标量值和单子值结合起来?

  5. 5

    在Redshift中,如何将CTAS与“如果不存在”子句结合起来?

  6. 6

    如何将Azure测试计划与管道结合起来?

  7. 7

    如何将词汇表和语法结合起来?

  8. 8

    Rust:如何将Entry API与拥有的数据结合起来?

  9. 9

    如何将获胜者和工作组结合起来?

  10. 10

    如何将这两种路线结合起来?

  11. 11

    如何将导航栏和分页结合起来?

  12. 12

    T-SQL:如何将多行代码与 if 语句结合起来

  13. 13

    如何将 3 个选择器与 a:hover 标签结合起来?

  14. 14

    如何将数据帧与熊猫中的冗余行结合起来

  15. 15

    如何将 Join 与聚合函数和分组依据结合起来

  16. 16

    如何将 var 与 var + repeat 结合起来?

  17. 17

    如何将 NSLayout 约束与 CGrect 框架(Swift4)结合起来

  18. 18

    如何将这两个 Less @Media 查询与“或”条件结合起来?

  19. 19

    如何将数据切换与数据工具提示结合起来?

  20. 20

    如何将延迟函数调用的顺序和并行执行结合起来?

  21. 21

    如何将这两种方法结合起来?

  22. 22

    rust-如何将这个宏与循环/递归结合起来?

  23. 23

    如何将代码隐藏和 javascript 函数结合起来?

  24. 24

    如何将两个字符串与随机位置结合起来

  25. 25

    如何将Angular2与jinja2模板和烧瓶结合起来

  26. 26

    如何将Cognito用户池与外部供应商(如Facebook)结合起来?

  27. 27

    我的第一个R Shiny,如何将selectinput与renderplot(ggplot)结合起来?

  28. 28

    如何将解析度与仅针对IE 11或更高版本的媒体查询结合起来?

  29. 29

    如何将棉花糖数据类与棉花糖oneofschema结合起来以实现多态结构?

热门标签

归档