【问题标题】:Return reference to Linkedlist element返回对 Linkedlist 元素的引用
【发布时间】:2017-02-22 13:01:37
【问题描述】:

我想实现一个函数,它实例化一个新元素,将它添加到一个链表中,然后返回对它刚刚创建的元素的引用。这是我想出的:

use std::collections::LinkedList;

struct Bar {
    ll: LinkedList<Foo>
}

struct Foo {}


impl Bar {
    fn foo_alloc<'a>(&'a mut self) -> &Option<&'a mut Foo> {
        let foo = Foo{};
        self.ll.push_back(foo);
        &self.ll.front_mut()
    }
}

我认为当我将返回的引用的生命周期绑定到Bar 实例(通过&amp;'a mut self)时,这应该足够了,但显然不是。

这是错误:

error: borrowed value does not live long enough
  --> src/main.rs:14:10
   |
14 |         &self.ll.front_mut()
   |          ^^^^^^^^^^^^^^^^^^^ does not live long enough
15 |     }
   |     - temporary value only lives until here
   |
note: borrowed value must be valid for the lifetime 'a as defined on the body at 11:59...
  --> src/main.rs:11:60
   |
11 |       fn foo_alloc<'a>(&'a mut self) -> &Option<&'a mut Foo> {
   |  ____________________________________________________________^ starting here...
12 | |         let foo = Foo{};
13 | |         self.ll.push_back(foo);
14 | |         &self.ll.front_mut()
15 | |     }
   | |_____^ ...ending here

【问题讨论】:

    标签: rust lifetime


    【解决方案1】:

    问题不在于Option 内部的引用,而在于Option 对象本身。按值返回,而不是按引用返回。

    impl Bar {
        fn foo_alloc(&mut self) -> Option<&mut Foo> {
            let foo = Foo{};
            self.ll.push_back(foo);
            self.ll.front_mut()
        }
    }
    

    我还删除了生命周期注释,因为默认的生命周期扣除在这里做了正确的事情。

    【讨论】:

    • 是的,解决了。说self.ll.front_mut() 在堆栈上创建一个Option&amp; 在它尝试返回对Option 的引用之前是否正确,因为它在方法结束时被丢弃,所以它的寿命当然不够长?
    • 是的,返回的Option是临时的,所以不能返回引用。
    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多