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

时间:2014-11-14 01:16:02

标签: 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());
}

2 个答案:

答案 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());
}

根据经验,首先尝试使用切片(&strString),如果由于所有权而无效,请使用String

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

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

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