我想OsStr为将发生多次的扩展比较定义一个常量。例如:
const DCM_EXTENSION: Option<&'static OsStr> = Some("dcm");
const DCM_EXTENSION: Option<&'static OsStr> = Some(OsStr::new("dcm"));
Run Code Online (Sandbox Code Playgroud)
这应该使进行比较变得微不足道且可靠:
if entry.file_type().is_file() && entry.path().extension() == DCM_EXTENSION:
Run Code Online (Sandbox Code Playgroud)
由于缺少 const fn 和类型不匹配,这两种方法都不起作用。
我目前的解决方法是在进行任何比较之前在运行时进行转换:
const DCM_EXTENSION_STR: Option<&'static str> = Some("dcm");
main!(|args: Cli, log_level: verbosity| {
let dcm_extension = DCM_EXTENSION_STR.map(OsStr::new);
// ...
});
Run Code Online (Sandbox Code Playgroud)
我认为这避免了lazy_static 会施加的每次访问惩罚,并计算出可以忽略不计的一次性运行时惩罚。
不,没有(还)。
但是,OsStr::new不能失败(它不返回Result或列出任何紧急情况)。AsRef是“廉价的引用到引用转换”。
这意味着您可以创建一个字符串文字并OsStr在使用站点将其转换为 an并且期望基本上没有开销。检查程序集甚至可能显示类型在编译时完全消失(零开销)。