【问题标题】:How do I convert an OsString to a u16 on POSIX systems?如何在 POSIX 系统上将 OsString 转换为 u16?
【发布时间】:2020-06-22 18:09:16
【问题描述】:

我正在通过std::env::var_os 从环境中获取一个字符串,并且我想尝试将通过匹配返回的Option<OsString> 接收到的结果OsString 转换为u16。我怎样才能以适用于 POSIX 系统的方式执行此操作?

【问题讨论】:

  • 你为什么用var_os而不是var?您是否打算处理非 UTF-8 环境变量?
  • @Shepmaster 好问题!我读到如果未设置变量,它会返回None,我喜欢这正是我想要的,但现在我看到var 并没有强迫我处理OsString 的东西。嗯。
  • var 如果丢失或无效则返回错误,您可以使用.ok() 将其更改为Option

标签: string rust type-conversion integer posix


【解决方案1】:

如果您想将Option<OsString> 转换为Option<u16>,您可以使用此函数:

use std::ffi::OsString;

fn to_integer(maybe_os_string: Option<OsString>) -> Option<u16> {
    if let Some(os_string) = maybe_os_string {
        if let Ok(string) = os_string.into_string() {
            if let Ok(integer) = string.parse::<u16>() {
                return Some(integer);
            }
        }
    }
    None
}

playground

无论底层操作系统如何,它都应该可以工作。如果不能将OsString 解析为u16,则函数的调用者必须处理None 的情况。

【讨论】:

  • 由于Option? 一起使用,您可以避免与maybe_os_string?.into_string().ok()?.parse::&lt;u16&gt;().ok() 的嵌套。
  • 如果要使用into_string,不如使用env::var,而不是env::var_os
  • maybe_os_string.and_then (|s| s.into_string().ok()).and_then (|s| s.parse::&lt;u16&gt;().ok())
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多