有没有办法表示 OsStr 或 OsString 文字?

spe*_*ase 6 rust

我想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 会施加的每次访问惩罚,并计算出可以忽略不计的一次性运行时惩罚。

She*_*ter 6

不,没有(还)。

但是,OsStr::new不能失败(它不返回Result或列出任何紧急情况)。AsRef是“廉价的引用到引用转换”。

这意味着您可以创建一个字符串文字并OsStr在使用站点将其转换为 an并且期望基本上没有开销。检查程序集甚至可能显示类型在编译时完全消失(零开销)。