您可以在正在构造的结构中引用先前初始化的字段吗?

Dwe*_*rly 5 rust

创建结构体的新实例时,您可以引用正在构造的结构体中先前初始化的字段吗?

示例代码:

use std::fs::File;
use std::io::BufReader;
use std::path::PathBuf;

#[derive(Debug)]
pub struct Test {
    file_handle: File,
    rdr: BufReader<File>,
}

impl Test {
    pub fn new(filepath: std::path::PathBuf) -> Self {
        Self {
            file_handle: File::open(&filepath)
                .expect(format!("Unable to open file {:?}", filepath).as_str()),
            rdr: BufReader::new(file_handle),
        }
    }
}

fn main() {
    let x = Test::new(PathBuf::from("my file"));
    println!("{:?}", x);
}
Run Code Online (Sandbox Code Playgroud)

生成错误:

use std::fs::File;
use std::io::BufReader;
use std::path::PathBuf;

#[derive(Debug)]
pub struct Test {
    file_handle: File,
    rdr: BufReader<File>,
}

impl Test {
    pub fn new(filepath: std::path::PathBuf) -> Self {
        Self {
            file_handle: File::open(&filepath)
                .expect(format!("Unable to open file {:?}", filepath).as_str()),
            rdr: BufReader::new(file_handle),
        }
    }
}

fn main() {
    let x = Test::new(PathBuf::from("my file"));
    println!("{:?}", x);
}
Run Code Online (Sandbox Code Playgroud)

这类事情是否有特定的模式,或者只是 Rust 的“禁忌”(与 Rust 的思想相反)?Rust 中“通常”会如何处理这样的事情?

更新

@Netwave 和 @Herohtar 指出了我的“非 Rustian”期望中的问题。谢谢,这些评论都很有道理,也回答了我另一个未提出的问题。

如果我将结构更改为

pub struct Test {
    a: String,
    b: String,
}
Run Code Online (Sandbox Code Playgroud)

我的实现很简单,例如:

pub fn new(ana: String) -> Self {
    Self {
        a: ana,
        b: a.clone(),
    }
}
Run Code Online (Sandbox Code Playgroud)

我会得到一个非常类似的错误。我假设 Rust 不希望我在“Self”块终止之前使用结构体字段。在我看来,编译器可以确定该字段已被设置,因此我怀疑有更深层次的原因来阻止这种行为。我仍处于摸索 Rust 之道的早期阶段,所以我想更好地理解这种(或任何:-))行为。

at5*_*321 2

这不可能。中BufReader::new(file_handle)file_handle感动。它不会被复制或克隆。另外,在这种情况下您不能使用&File引用,但即使可以,您也会遇到自引用结构的另一个众所周知的限制。

也许您最好的选择是仅存储BufReader,如果您需要某些文件处理程序,请通过get_ref().