Struct 是否有单行语法用于构造包含对临时对象的引用的结构?
考虑以下无效的防锈代码。有一个structStruct 是否有单行语法用于构造包含对临时对象的引用的结构?,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 {
Foo
包含对第二个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 {
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是正交的。