我想为扩展比较定义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施加的每次访问惩罚,并且可以忽略不计的一次性运行时惩罚。
答案 0 :(得分:3)
不,还没有(还)。
但是,OsStr::new
不能失败(它不会返回Result
或列出任何恐慌情况)。 AsRef
是&#34;廉价的参考转换参考转换&#34;。
这意味着您可以创建一个字符串文字并将其转换为使用地点的OsStr
,并且预计基本上没有开销。检查程序集甚至可能表明类型在编译时完全消失(零开销)。