学习记录
rust
static DEBUG_ENABLED: std::sync::OnceLock<bool> = std::sync::OnceLock::new();
fn is_debug_enabled() -> bool {
*DEBUG_ENABLED.get_or_init(|| {
// 初始化逻辑,例如检查环境变量
std::env::var("DEBUG").is_ok()
})
}定义了一个静态变量 DEBUG_ENABLED ,使用了 Rust 标准库中的 std::sync::OnceLock<bool> 类型,并初始化为 std::sync::OnceLock::new() 。
OnceLock 是什么?
OnceLock 是 Rust 标准库中的一个同步原语,用于在多线程环境中安全地初始化和访问值。它的主要特点是:
- 线程安全 :多个线程可以同时访问,但初始化操作只会执行一次
- 延迟初始化 :值只会在首次访问时被初始化
- 不可变访问 :一旦初始化完成,值就不可再修改
当首次调用 is_debug_enabled() 时, OnceLock 会执行初始化闭包,检查环境变量 DEBUG 是否存在,然后将结果存储起来。后续的调用会直接返回存储的值,不会重复执行初始化逻辑。
这种模式在需要全局配置或状态,且初始化成本较高的场景中非常常见。
rust
#[inline]
pub fn normalize_to_posix(path: &str) -> String {
path.replace('\\', "/")
}#[inline] 是 Rust 中的一个属性(attribute),用于向编译器建议对函数进行内联(inline)优化。
内联优化的含义
当编译器对函数进行内联时,它会:
- 在调用该函数的地方直接插入函数体的代码
- 而不是执行常规的函数调用(保存上下文、跳转到函数地址、执行、返回等操作)
对于短小、频繁调用的函数,内联可以:
- 减少函数调用的开销
- 允许编译器进行更多的上下文优化
- 提高执行效率
需要注意的是, #[inline] 只是一个 建议 ,而不是强制命令:
- 编译器会根据实际情况决定是否执行内联
- 对于非常复杂的函数,即使标记了
#[inline],编译器也可能选择不内联 - 反之,对于某些未标记
#[inline]的简单函数,编译器也可能自动进行内联
rust
//获取当前正在执行的可执行文件的路径 ,并将其赋值给 path 变量
let path = std::env::current_exe()?;- current_exe() 函数用于获取当前正在运行的可执行文件的完整路径。
- ? 操作符(错误传播操作符)
- 作用 : ? 用于简化 Result 类型的错误处理。它的行为是:
- 如果 current_exe() 返回 Ok(值) ,则提取其中的 值 (这里是 PathBuf 类型的路径)并赋给 path 变量。
- 如果 current_exe() 返回 Err(错误) ,则将该错误从当前函数中返回,相当于提前退出函数并将错误传播给调用者。
- 使用条件 :这行代码所在的函数 必须返回 Result 类型 (或实现了 Try trait 的类型),否则编译会报错。
- 作用 : ? 用于简化 Result 类型的错误处理。它的行为是:
rust
pub(crate) fn current_git_ai_exe() -> Result<PathBuf, GitAiError> {
let path = std::env::current_exe()?;
Ok(resolve_git_ai_exe_from_invocation_path(path))
}pub(crate) 的含义
- pub :表示 "public",即公开的。
- (crate) :是一个可见性限定符,限定了公开的范围为 当前 crate(包) 。 换句话说, pub(crate) 修饰的函数、结构体或其他项 只能在当前 crate 内部被访问 ,在 crate 外部是不可见的。
rust
let git_name = if cfg!(windows) { "git.exe" } else { "git" };
#[cfg(windows)]
pub const CREATE_NO_WINDOW: u32 = 0x08000000;
#[cfg(not(windows))]
pub type DaemonClientStream = LocalSocketStream;cfg! 是 Rust 中的一个 条件编译宏 (conditional compilation macro),用于在编译时根据目标平台或配置来生成不同的代码。下面是详细解释:
cfg! 宏的作用
- 编译时判断 : cfg! 在编译时评估条件,而不是运行时。
- 返回布尔值 :根据条件是否满足,返回 true 或 false 。
- 平台检测 :最常见的用途是检测目标操作系统、架构等。
写法差异
cfg! 宏 :返回布尔值,用于运行时逻辑判断(如 if 语句)。
#[cfg(...)] 属性 :直接控制代码块是否被编译(更彻底的条件编译)。
rust// 使用 cfg! 宏 let git_name = if cfg!(windows) { "git.exe" } else { "git" }; // 使用 #[cfg(...)] 属性 #[cfg(windows)] let git_name = "git.exe"; #[cfg(not(windows))] let git_name = "git";
rust
let Some(file_name) = path.file_name().and_then(|n| n.to_str()) else {
return canonical_path;
};