是否仅在启动时评估

Evaluate if only on startup

考虑以下示例:

use std::fs;
use std::path::Path;

fn get_battery() -> String {
    let power = if Path::new("/sys/class/power_supply/BAT0/power_now").exists() {
        fs::read_to_string("/sys/class/power_supply/BAT0/power_now")
            .expect("Error BAT0/power_now")
            .trim()
            .parse::<f32>()
            .unwrap()
            / f32::powi(10.0, 6)
    } else {
        let current = fs::read_to_string("/sys/class/power_supply/BAT0/current_now")
            .expect("Error BAT0/current_now")
            .trim()
            .parse::<f32>()
            .unwrap()
            / f32::powi(10.0, 6);
        let voltage = fs::read_to_string("/sys/class/power_supply/BAT0/voltage_now")
            .expect("Error BAT0/voltage_now")
            .trim()
            .parse::<f32>()
            .unwrap()
            / f32::powi(10.0, 6);
        current * voltage
    };

    return power.to_string()
}

fn main() {

    loop {
        std::thread::sleep(std::time::Duration::from_secs(1))
        println!("{}", get_battery());
    }
}

我想在 get_battery 函数内部评估 if 语句,一旦启动并在后续函数调用中遵循该分支(读取功率或读取 current/voltage) .

有没有办法让编译器编译同一函数的两个版本,运行根据启动时文件的存在来编译正确的版本?

谢谢

您可以使用 once_cell crate 和两个函数来完成。像这样的东西(未经测试):

use once_cell::sync::Lazy;
use std::fs;
use std::path::Path;

fn get_power() -> f32 {
    fs::read_to_string("/sys/class/power_supply/BAT0/power_now")
        .expect("Error BAT0/power_now")
        .trim()
        .parse::<f32>()
        .unwrap()
        / f32::powi(10.0, 6)
}

fn get_current_voltage() -> f32 {
    let current = fs::read_to_string("/sys/class/power_supply/BAT0/current_now")
        .expect("Error BAT0/current_now")
        .trim()
        .parse::<f32>()
        .unwrap()
        / f32::powi(10.0, 6);
    let voltage = fs::read_to_string("/sys/class/power_supply/BAT0/voltage_now")
        .expect("Error BAT0/voltage_now")
        .trim()
        .parse::<f32>()
        .unwrap()
        / f32::powi(10.0, 6);
    current * voltage
}

static GET_POWER: Lazy<fn()->f32> = Lazy::new(|| {
    if Path::new("/sys/class/power_supply/BAT0/power_now").exists() {
        get_power
    } else {
        get_current_voltage
    }
});