我看到
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)
在.something()你想叫.as_slice().通常对于这个词&[T]在锈是一个切片,并且命名约定来廉价地借用类型作为另一个(在此情况下,从一个Vec<T>)是.as_foo().在这个新的比较中,您正在比较&[u8],而不是分配新Vec的比较.这应该更高效,更可读,因为不需要分配.
assert_eq!(bytes.as_slice(), b"hello");
Run Code Online (Sandbox Code Playgroud)
首先,你最好这样写:
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)
无需转换String为Vec<u8>第一个。
| 归档时间: |
|
| 查看次数: |
1812 次 |
| 最近记录: |