rust - std :: string :: String作为字节字符串(即b"foo"或不推荐的字节!("foo"))

Vic*_*ory 3 rust

我看到

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

但我想做的是

assert_eq!(s.something(), b"hello");
Run Code Online (Sandbox Code Playgroud)

哪里.something()只是一个占位符,它可能是something(s)或类似的.

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

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

McP*_*inM 6

.something()你想叫.as_slice().通常对于这个词&[T]在锈是一个切片,并且命名约定来廉价地借用类型作为另一个(在此情况下,从一个Vec<T>)是.as_foo().在这个新的比较中,您正在比较&[u8],而不是分配新Vec的比较.这应该更高效,更可读,因为不需要分配.

    assert_eq!(bytes.as_slice(), b"hello");
Run Code Online (Sandbox Code Playgroud)


Vla*_*eev 5

首先,你最好这样写:

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

像这样:

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

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

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

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

无需转换StringVec<u8>第一个。