创建结构体的新实例时,您可以引用正在构造的结构体中先前初始化的字段吗?
示例代码:
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 之道的早期阶段,所以我想更好地理解这种(或任何:-))行为。
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |