Rust字符串转换以及切片问题研究

from to 函数
&str String String::from(s) 或 s.to_string() 或 s.to_owned()
&str &[u8] s.as_bytes()
&str Vec s.as_bytes().to_vec()
String &[u8] s.as_bytes()
String &str s.as_str() 或 &s
String Vec s.into_bytes()
&[u8] &str std::str::from_utf8(s).unwrap()
&[u8] String String::from_utf8(s).unwrap()
&[u8] Vec s.to_vec()
Vec &str std::str::from_utf8(&s).unwrap()
Vec String String::from_utf8(s).unwrap()
Vec &[u8] &s 或 s.as_slice()

注:变量 s 为 from 类型

示例:

String 和 &str 之间的转换:

// String 转 &str
let s = String::from("hello");
let s_slice: &str = &s;
// &str 转 String
let s = "hello";
let s_string: String = s.to_string();

Vec 和 &[u8] 之间的转换

// Vec<u8> 转 &[u8]
let v: Vec<u8> = vec![72, 101, 108, 108, 111]; // "Hello"
let v_slice: &[u8] = &v;
// &[u8] 转 Vec<u8>
let v_slice: &[u8] = &[72, 101, 108, 108, 111]; // "Hello"
let v_vec: Vec<u8> = v_slice.to_vec();

String 和 Vec 之间的转换:

// String 转 Vec<u8>
let s = String::from("hello");
let v: Vec<u8> = s.into_bytes();
// Vec<u8> 转 String
let v: Vec<u8> = vec![104, 101, 108, 108, 111]; // "hello"
let s: String = String::from_utf8_lossy(&v).to_string();

&str 和 &[u8] 之间的转换:

// &str 转 &[u8]
let s: &str = "hello";
let s_bytes: &[u8] = s.as_bytes();
// &[u8] 转 &str
let s_bytes: &[u8] = &[104, 101, 108, 108, 111]; // "hello"
let s_str: &str = std::str::from_utf8(s_bytes).unwrap(); 

注意:在这些转换中,可能会出现编码问题。
特别是,在将字节序列转换为字符串时,必须考虑编码方式(例如UTF-8),否则会导致错误。
在某些情况下,使用特定的编码方式(例如ISO 8859-1)可能更合适。

删除String字符串首末位字符的几个方法:

方法一:

fn main() {
    let mut s = "Hello World".to_string();
    s.pop();      // remove last
    s.remove(0);  // remove first
}

方法二:
使用.char()迭代器并忽略第一个和最后一个元素:

fn rem_first_and_last(value: &str) -> &str {
    let mut chars = value.chars();
    chars.next();      //推进迭代器并返回下一个值
    chars.next_back(); //从迭代器的末尾删除并返回一个元素
    chars.as_str()
}

能够正确处理多字节 unicode 字符串,但可能会产生额外的开销。

方法三:
使用 split_at() 对字符串进行分割,它的返回值是 (&str, &str) 形式:

fn main() {
    let msg = "Hello, world!";
    let msg = msg.split_at(msg.len() - 1);
    let msg = msg.0.split_at(1);
    println!("{}", msg.1);
}

方法四:

fn main() {
    let string: &str = "Hello World";
    let first_last_off: &str = &string[1..string.len() - 1];
    println!("{}", first_last_off);
}

感谢:爬一手好线杆Zerounarystackoom

posted @ 2023-05-30 17:37  成豪  阅读(663)  评论(0编辑  收藏  举报