【问题标题】:Proper way to access Vec<&[u8]> as strings [duplicate]以字符串形式访问 Vec<&[u8]> 的正确方法[重复]
【发布时间】:2019-11-01 23:37:36
【问题描述】:

我有一个Vec&lt;&amp;[u8]&gt;,我想像这样转换为String

let rfrce: Vec<&[u8]> = rec.alleles();

for r in rfrce {
    // create new String from rfrce
}

我试过了,但它不起作用,因为只能将u8 转换为char,但[u8] 转换为char 是不可能的:

let rfrce = rec.alleles();

let mut str = String::from("");

for r in rfrce {
    str.push(*r as char);
}

【问题讨论】:

  • 这种转换的预期逻辑是什么?那些[u8] 里有什么?
  • 对于此类问题,我在 freenode 中使用 Rust 社区 IRC 频道(chat.freenode.net 端口:6697,频道名称:##rust)。他们给了我快速的工作答案

标签: string utf-8 rust slice


【解决方案1】:

因为ru8的数组,所以需要将其转换为有效的&amp;str,并使用Stringpush_str方法。

use std::str;

fn main() {
    let rfrce = vec![&[65,66,67], &[68,69,70]];

    let mut str = String::new();

    for r in rfrce {
        str.push_str(str::from_utf8(r).unwrap());
    }

    println!("{}", str);
}

Rust Playground

【讨论】:

  • 谢谢,我发现我的 Vec 看起来像 [[67, 84], [71, 84], [67]] 或字符串:CTGTC。我想将 vec 拆分为 3 个字符串:str1 = CT、str2 = GT 和 str3 = C。
  • 带错误处理:play.rust-lang.org/…
  • @fxwiegand 你可以用Vec&lt;&amp;str&gt;Rust Playground
【解决方案2】:

我会选择TryFrom&lt;u32&gt;

fn to_string(v: &[&[u8]]) -> Result<String, std::char::CharTryFromError> {
    /// Transform a &[u8] to an UTF-8 codepoint
    fn su8_to_u32(s: &[u8]) -> Option<u32> {
        if s.len() > 4 {
            None
        } else {
            let shift = (0..=32).step_by(8);
            let result = s.iter().rev().cloned().zip(shift).map(|(u, shift)| (u as u32) << shift).sum();
            Some(result)
        }
    }

    use std::convert::TryFrom;

    v.iter().map(|&s| su8_to_u32(s)).try_fold(String::new(), |mut s, u| {
        let u = u.unwrap(); //TODO error handling
        s.push(char::try_from(u)?);
        Ok(s)
    })
}

fn main() {
    let rfrce: Vec<&[u8]> = vec![&[48][..], &[49][..], &[50][..], &[51][..]];
    assert_eq!(to_string(&rfrce), Ok("0123".into()));

    let rfrce: Vec<&[u8]> = vec![&[0xc3, 0xa9][..]]; // https://www.utf8icons.com/character/50089/utf-8-character
    assert_eq!(to_string(&rfrce), Ok("쎩".into()));

}

【讨论】:

    猜你喜欢
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多