rust - 有什么方法可以表示 OsStr 或 OsString 文字吗?

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

最佳答案

不,(还)没有。

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

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

关于rust - 有什么方法可以表示 OsStr 或 OsString 文字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226783/

相关文章:

rust - 如何将结构设为非公开且不将其从 lib.rs 中移出?

rust - 我应该如何减少 rust 类型签名的重复?

error-handling - 传播错误的正确方法是什么?

rust - 无法从 `use` 附带的外部 crate 中找到符号

testing - 如何设置 RUST_TEST_TASKS 环境变量?

从 &str 解析日期的 Rustacean 方法 [Rust]

rust - 什么特征阻止参数包含指向堆分配的数据的指针?

调试失败!在图书馆

rust - 为什么使用 Rust 将可变结构传递给函数会导致不可变字段?

rust - 在默认特征实现中使用关联常量