是否仅在启动时评估
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
}
});
考虑以下示例:
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
}
});