2014-11-14 2 views
2

나는녹 - 바이트 문자열로 표준 : : 문자열 : 문자열 (예 : "foo는"또는 사용되지 않는 바이트 ("foo는") 나!)

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

는하지만, 내가 뭘하고 싶은 것은 볼 .something() 그냥 자리 표시 자입니다

assert_eq!(s.something(), b"hello"); 

을 가지고, 그것은 something(s) 또는 이와 유사한 일 수 있습니다. 나는이 일을하고

그래서 난

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

답변

5

로 문자열을 사용할 수 .something() 당신이 원하는이 .as_slice()을 호출되는. 일반적으로 녹이있는 &[T]의 단어는 슬라이스이며 다른 유형 (이 경우 Vec<T>)을 저렴하게 빌리는 명명 규칙은 .as_foo()입니다. 이 새로운 비교에서 비교할 새 Vec을 할당하는 대신 &[u8]을 비교합니다. 할당이 필요 없으므로이 방법은 읽기 쉽고 효율적입니다. 모든

assert_eq!(bytes.as_slice(), b"hello"); 
+0

답장을 보내 주셔서 감사합니다. + 1 + accept – Victory

1

첫째, 당신은 더 나은이 쓰기 :이 같은

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

을 :

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

을 경험적으로, 첫 번째 조각 (String에 대한 &str)를 사용하려고, 소유권으로 인해 작동하지 않는 경우 String을 사용하십시오.

둘째는, 당신이 찾고있는 방법은 as_bytes()라고 : 첫째 Vec<u8>String을 변환 할 필요가 없습니다

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

.

+0

답변과 그에 대한 추가 통찰력을 주셔서 대단히 감사합니다. 나는 +1하지만 개인적인 규칙으로 항상 첫 번째 정답을 받아들입니다. 나는 어림짐작의 뒤에 추론이 인 무슨 알기에 흥미있을 것입니다. 감사! – Victory

+1

@ 빅토리, 그것은 당신의 기능을 좀 더 일반적으로 만듭니다. 참조 (또는 슬라이스)를 취하는 함수가있는 경우 데이터를 소유하거나 참조가있는 경우 해당 함수로 작업 할 수 있습니다. 소유 한 데이터에서 참조/슬라이스를 얻는 것은 매우 쉽고 기본적으로 무료입니다. 함수가 참조가 아닌 경우 (예 :'& str' 대신'String'), 소유 한 데이터 만 전달할 수 있습니다. 데이터를 소유 한 경우 소유권을 기능에 전달 (바람직하지 않을 수 있음)하거나 데이터를 복제합니다 (일반적으로 비용이 많이 들며 불가능할 수도 있음). 참조가있는 경우 복제 만 * 할 수 있습니다. –

+0

다시 한번 감사드립니다. 귀하의 답변을 읽고 검색 한 후 귀하의 어림짐작에 대한 확인을 발견했습니다. 나는 다른 사람들이 내가 발견 한 링크를 읽는 것이 도움이 될 것이라고 생각한다 : http://doc.rust-lang.org/guide-strings.html – Victory