我有一个字符串变量“Program”,想要找到其中字符'g'的索引位置。
虽然有点复杂,但另一个解决方案是使用Chars
迭代器和它的position()
函数:
"Program".chars().position(|c| c == 'g').unwrap()
find
用于已接受的解决方案中返回字节偏移量,而不一定是字符索引。它适用于基本ASCII字符串,如问题中的字符串,虽然在使用多字节Unicode字符串时也会返回值,但将结果值视为字符索引将会导致问题。
以下内容有效:
let my_string = "Program";
let g_index = my_string.find("g"); // 3
let g: String = my_string.chars().skip(g_index).take(1).collect();
assert_eq!("g", g); // g is "g"
这不起作用:
let my_string = "プログラマーズ";
let g_index = my_string.find("グ"); // 6
let g: String = my_string.chars().skip(g_index).take(1).collect();
assert_eq!("グ", g); // g is "ズ"
chars().skip()
一起使用,而应该用于切片:let g: String = my_string[g_index..].chars().take(1).collect();
这样无论您使用什么类型的字符都可以正常工作。 - hkBst您正在寻找与字符串相关的 find
方法。要查找 "Program"
中 'g'
的索引,可以执行以下操作:
"Program".find('g')
"Program".find('g')
"ඞggregate"
.chars()
.enumerate()
.filter(|(_, c)| *c == 'g')
.map(|(i, _)| i)
.collect::<Vec<_>>(); // [1, 2, 5]
"aggregate"
.bytes()
.enumerate()
.filter(|(_, b)| *b == b'g')
.map(|(i, _)| i)
.collect::<Vec<_>>(); // [1, 2, 5]