Struct 是否有单行语法用于构造包含对临时对象的引用的结构?

Struct 是否有单行语法用于构造包含对临时对象的引用的结构?,struct,rust,borrow-checker,Struct,Rust,Borrow Checker,考虑以下无效的防锈代码。有一个structFoo包含对第二个structBar的引用: struct Foo<'a> { bar: &'a Bar, } impl<'a> Foo<'a> { fn new(bar: &'a Bar) -> Foo<'a> { Foo { bar } } } struct Bar { value: String, } impl Bar {

考虑以下无效的防锈代码。有一个struct
Foo
包含对第二个struct
Bar
的引用:

struct Foo<'a> {
    bar: &'a Bar,
}

impl<'a> Foo<'a> {
    fn new(bar: &'a Bar) -> Foo<'a> {
        Foo { bar }
    }
}

struct Bar {
    value: String,
}

impl Bar {
    fn empty() -> Bar {
        Bar {
            value: String::from("***"),
        }
    }
}

fn main() {
    let foo = Foo::new(&Bar::empty());
    println!("{}", foo.bar.value);
}
我可以按照编译器所说的去做——使用
let
绑定:

fn main() {
    let bar = &Bar::empty();
    let foo = Foo::new(bar);
    println!("{}", foo.bar.value);
}

然而,突然间,我需要两行代码来完成一些琐碎的事情,比如实例化我的
Foo
。有没有简单的方法用一行程序来解决这个问题?

没有,除了您键入的语法之外,没有其他语法

有关引用临时文件时其寿命的详细信息,请参阅:


将有一个父结构同时拥有引用它的
bar
foo
s

祝你好运:


谁应该拥有
Foo::new(&Bar::empty())
中的
Bar
Foo
struct不拥有它,它只引用它。您确定您想要的是一个
和一个条形
,而不仅仅是
条形
,或类似于
,或
Rc
?目前,如果没有
Bar
,您的
Foo
就没有存在的理由,因此如果没有
Bar
在作用域中,您无法实例化
Foo
。@Andreytukin将有一个父结构同时拥有Bar和引用它的Foo。因此,foos将从父结构中派生,并带有对条的引用。然而,当我编写测试时,我想用一个一次性的虚拟条创建很多foo,我发现我的代码非常复杂
println!(“{}”,Foo::new(&Bar::empty()).Bar.value)工作,因为“如果您立即将引用分配给let语句中的某个变量(或使其成为立即分配的某个结构或数组的一部分),则Rust会使[referenced]匿名变量在let初始化的变量[…]期间有效。”否则,匿名变量将一直存在到封闭语句的末尾”(Blandy、Orendorff)。特别是第二部分对于简短的
assert
语句似乎很有用。@Andreytukin感谢您的输入。不幸的是,我需要使用
new
构造函数。在使用结构的同一行代码中进行构造通常是不可行的,因为它可能用于多个断言等。因此我想我必须使用单独的
let
语句来创建条。@Anders如果这足够烦人,你可以创建一个简单的宏来使用更短的语法。既然NLL是稳定的,有人研究过延长临时人员的生命周期是否是个好主意吗?@starblue老实说,我认为这会让它起作用,但它(还?)不起作用@starblue啊,就是说,所以它可能在将来起作用。我认为它与NLL是正交的。