我看到
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");