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

时间:2018-03-12 01:05:25

标签: rust

我想为扩展比较定义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施加的每次访问惩罚,并且可以忽略不计的一次性运行时惩罚。

1 个答案:

答案 0 :(得分:3)

不,还没有(还)。

但是,OsStr::new不能失败(它不会返回Result或列出任何恐慌情况)。 AsRef是&#34;廉价的参考转换参考转换&#34;。

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