我明白了
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());
}
答案 0 :(得分:6)
您想要的.something()
称为.as_slice()
。通常,生锈中&[T]
的单词是一个切片,而廉价借用另一种类型(在这种情况下,来自Vec<T>
)的命名约定是.as_foo()
。在此新比较中,您要比较&[u8]
,而不是分配新的Vec
进行比较。这应该更高效,更可读,因为不需要分配。
assert_eq!(bytes.as_slice(), b"hello");
答案 1 :(得分:3)
首先,你最好写下这个:
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>
。