std::string::字符串作为字节字符串(即 b "foo"或已弃用的字节!"foo" ))

  • 本文关键字:foo 字节 字符串 string std rust
  • 更新时间 :
  • 英文 :


我看到

let s = String::from_str("hello");
let bytes = s.into_bytes();
assert_eq!(bytes, vec![104, 101, 108, 108, 111]);

但我想做的是拥有

assert_eq!(s.something(), b"hello");

如果.something()只是一个占位符,则可能是something(s)或类似。

我正在这样做,所以我可以使用字符串

fn foo(mut stream: BufferedStream<TcpStream>, str: String) {
   stream.write(str.something());
}

您想要的.something()称为.as_slice()。 通常,锈&[T]的单词是切片,并且廉价地借用一种类型作为另一种类型(在这种情况下,来自Vec<T>)的命名约定是.as_foo()。 在此新比较中,您正在比较&[u8],而不是分配新的Vec进行比较。 这应该更有效,也更具可读性,因为不需要分配。

    assert_eq!(bytes.as_slice(), b"hello");

首先,你最好写这个:

fn foo(mut stream: BufferedStream<TcpStream>, s: String) {
   stream.write(s.something());
}

如:

fn foo(mut stream: BufferedStream<TcpStream>, s: &str) {
   stream.write(s.something());
}

根据经验,首先尝试使用切片(&str用于String),如果由于所有权而不起作用,请使用 String

其次,您正在寻找的方法称为as_bytes()

fn foo(mut stream: BufferedStream<TcpStream>, s: &str) {
   stream.write(s.as_bytes());
}

无需先将String转换为Vec<u8>

试试看:

  let bytes = vec![104, 101, 108, 108, 111];
  assert_eq!(String::from_utf8(bytes.to_vec()).unwrap(), "hello");

最新更新