2.6 Rust Slice Type
Posted perfei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.6 Rust Slice Type相关的知识,希望对你有一定的参考价值。
字符串操作
fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b‘ ‘ { return i; } } s.len() }
Because we need to go through the String
element by element and check whether a value is a space, we’ll convert our String
to an array of bytes using the as_bytes
method
For now, know that iter
is a method that returns each element in a collection and that enumerate
wraps the result of iter
and returns each element as part of a tuple instead. The first element of the tuple returned from enumerate
is the index, and the second element is a reference to the element. This is a bit more convenient than calculating the index ourselves.
Because the enumerate
method returns a tuple, we can use patterns to destructure that tuple, just like everywhere else in Rust. So in the for
loop, we specify a pattern that has i
for the index in the tuple and &item
for the single byte in the tuple. Because we get a reference to the element from .iter().enumerate()
, we use &
in the pattern.
Inside the for
loop, we search for the byte that represents the space by using the byte literal syntax. If we find a space, we return the position. Otherwise, we return the length of the string by using s.len()
fn main() { let mut s = String::from("hello world"); let _word = first_word(&s); // word will get the value 5 println!("{},{}",s,_word); s.clear(); // this empties the String, making it equal to "" // word still has the value 5 here, but there‘s no more string that // we could meaningfully use the value 5 with. word is now totally invalid! } fn first_word(s: &String) -> usize { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b‘ ‘ { return i; } } s.len() }
字符串切片
With Rust’s ..
range syntax, if you want to start at the first index (zero), you can drop the value before the two periods. In other words, these are equal:
let s = String::from("hello"); let slice = &s[0..2]; let slice = &s[..2];
By the same token, if your slice includes the last byte of the String
, you can drop the trailing number. That means these are equal:
let s = String::from("hello"); let len = s.len(); let slice = &s[3..len]; let slice = &s[3..];
You can also drop both values to take a slice of the entire string. So these are equal:
let s = String::from("hello"); let len = s.len(); let slice = &s[0..len]; let slice = &s[..];
Note: String slice range indices must occur at valid UTF-8 character boundaries. If you attempt to create a string slice in the middle of a multibyte character, your program will exit with an error.
重写字符串操作
fn first_word(s: &String) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b‘ ‘ { return &s[0..i]; } } &s[..] }
以上是关于2.6 Rust Slice Type的主要内容,如果未能解决你的问题,请参考以下文章
文心一言 VS 讯飞星火 VS chatgpt (19)-- go语言的slice和rust语言的Vec的扩容流程是什么?