我想定义一个 OsStr
常量来进行多次扩展比较。例如:
const DCM_EXTENSION: Option<&'static OsStr> = Some("dcm");
const DCM_EXTENSION: Option<&'static OsStr> = Some(OsStr::new("dcm"));
这应该使比较变得微不足道且不会出错:
if entry.file_type().is_file() && entry.path().extension() == DCM_EXTENSION:
由于缺少 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);
// ...
});
我认为这避免了 lazy_static 会施加的每次访问惩罚,并且可以忽略不计的一次性运行时惩罚。
最佳答案
不,(还)没有。
但是,OsStr::new
不会失败(它不会返回Result
或列出任何 panic 情况)。 AsRef
是“廉价的引用到引用的转换”。
这意味着您可以创建一个字符串文字并在使用站点将其转换为 OsStr
并且期望基本上没有开销。检查程序集甚至可能显示类型在编译时完全消失(零开销)。
关于rust - 有什么方法可以表示 OsStr 或 OsString 文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226783/