Rust 不能作为不可变借用,因为它也是作为可变借用的

Rust 不能作为不可变借用,因为它也是作为可变借用的,rust,Rust,我正在使用库中的structsFoo和Bar,客户端代码中出现编译错误。我将代码简化为: use std::marker::PhantomData; struct Foo { some_str: &'static str, } struct Bar<'a> { some_str: &'static str, marker: PhantomData<&'a Foo>, } impl Foo { fn read_d

我正在使用库中的structs
Foo
Bar
,客户端代码中出现编译错误。我将代码简化为:

use std::marker::PhantomData;

struct Foo {
    some_str: &'static str,
}

struct Bar<'a> {
    some_str: &'static str,
    marker: PhantomData<&'a Foo>,
}

impl Foo {
    fn read_data(&self) {
        // add code here
    }
    fn create_bar<'a>(&'a mut self) -> Bar<'a> {
        Bar {
            some_str: "test2",
            marker: PhantomData,
        }
    }
}

fn process(_arr: &mut [Bar]) {}

fn main() {
    let mut foo = Foo { some_str: "test" };
    let mut array: [Bar; 1] = [foo.create_bar()];
    process(&mut array);
    foo.read_data();
}

控制台输出中的错误非常明显,但我无法修复该问题

您可以通过使用大括号(
{…}
)将
数组
变量放置在新的作用域中来限制其生存期:


默认情况下,一旦启用,原始代码将按原样工作:

#![feature(nll)]

use std::marker::PhantomData;

struct Foo {
    some_str: &'static str,
}

struct Bar<'a> {
    some_str: &'static str,
    marker: PhantomData<&'a Foo>,
}

impl Foo {
    fn read_data(&self) {
        // add code here
    }
    fn create_bar<'a>(&'a mut self) -> Bar<'a> {
        Bar {
            some_str: "test2",
            marker: PhantomData,
        }
    }
}

fn process(_arr: &mut [Bar]) {}

fn main() {
    let mut foo = Foo { some_str: "test" };
    let mut array: [Bar; 1] = [foo.create_bar()];
    process(&mut array);
    foo.read_data();
}
#![专题(nll)]
使用std::marker::PhantomData;
结构Foo{
一些_str:&'s static str,
}

struct Bar(&'a mut self)->可以显式指定变量'foo'比不带括号的数组变量寿命更长吗?不,我认为不可能。看起来有一些借用检查程序错误。
Bar
结构包含对
Foo
的不可变引用,但Rust认为借用的
Foo
是可变的。@aSpex
create\u Bar
采用了一个
和一个mut self
:这就是可变借用Foo的原因。即使在本例中您实际上根本没有使用
self
'a
生存期将从分配到
array
array
超出范围。使用括号可以限制
数组的范围并结束可变借用。目前正在进行的工作是添加“非词汇生存期”,这将使Rust足够聪明,能够自行判断出在这种情况下,
'a
实际上不需要转到函数的末尾,因为
数组在
foo之后不被使用
#![feature(nll)]

use std::marker::PhantomData;

struct Foo {
    some_str: &'static str,
}

struct Bar<'a> {
    some_str: &'static str,
    marker: PhantomData<&'a Foo>,
}

impl Foo {
    fn read_data(&self) {
        // add code here
    }
    fn create_bar<'a>(&'a mut self) -> Bar<'a> {
        Bar {
            some_str: "test2",
            marker: PhantomData,
        }
    }
}

fn process(_arr: &mut [Bar]) {}

fn main() {
    let mut foo = Foo { some_str: "test" };
    let mut array: [Bar; 1] = [foo.create_bar()];
    process(&mut array);
    foo.read_data();
}