'Can you reference a previously initialized field within the struct under construction?

When creating a new instance of a struct can you reference a previously initialized field within the struct under construction?

Example code:

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);
}

Error generated:

error[E0425]: cannot find value `file_handle` in this scope
  --> src/lib.rs:16:33
   |
16 |             rdr: BufReader::new(file_handle),
   |                                 ^^^^^^^^^^^ a field by this name exists in `Self`

Is there a specific pattern for this sort of thing, or is it just a Rust "no-no" (antithetical to the ideas of Rust)? How would something like this 'normally' be handled in Rust?

Update

@Netwave and @Herohtar have pointed out problems in my 'non-Rustian' expectations. Thank you, those comments both make sense and answer another un-ask question I had.

Still if I change my struct to

pub struct Test {
    a: String,
    b: String,
}

and my impl to something simple like:

pub fn new(ana: String) -> Self {
    Self {
        a: ana,
        b: a.clone(),
    }
}

I'll get a very similar error. I'm assuming Rust does not want me to use a struct field before the 'Self' block has been terminated. It seems to me the compiler could determine that the field has been set, so I suspect there is a deeper reason to prevent this behavior. I'm still in the very early stages of grok'ing the tao of Rust so I'd like to understand this (or any :-)) behavior better.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source