我想获取 std::str
的第一个字符。目前的方法 char_at()
和 String::slice_chars
都是不稳定的。
我想到了以下方法,但似乎过于复杂,因为只需要获取单个字符而没有使用其余的向量:
let text = "hello world!";
let char_vec: Vec<char> = text.chars().collect();
let ch = char_vec[0];
我想获取 std::str
的第一个字符。目前的方法 char_at()
和 String::slice_chars
都是不稳定的。
我想到了以下方法,但似乎过于复杂,因为只需要获取单个字符而没有使用其余的向量:
let text = "hello world!";
let char_vec: Vec<char> = text.chars().collect();
let ch = char_vec[0];
UTF-8并没有定义什么是“字符”,因此这取决于你想要什么。在这种情况下,char
是Unicode标量值,因此&str
的第一个char
将介于1个到4个字节之间。
如果你只想要第一个char
,那就不要收集到Vec<char>
中,直接使用迭代器:
let text = "hello world!";
let ch = text.chars().next().unwrap();
或者,您可以使用迭代器的nth
方法:
let ch = text.chars().nth(0).unwrap();
请注意,在传递给nth
的索引之前的元素将从迭代器中消耗掉。&str
的开头和剩余部分:fn car_cdr(s: &str) -> (&str, &str) {
for i in 1..5 {
let r = s.get(0..i);
match r {
Some(x) => return (x, &s[i..]),
None => (),
}
}
(&s[0..0], s)
}
使用方法如下:
let (first_char, remainder) = car_cdr("test");
println!("first char: {}\nremainder: {}", first_char, remainder);
first char: t
remainder: est
对于超过1个字节的字符,它可以正常工作。
我认为这相当简单明了
let text = "hello world!";
let c: char = text.chars().next().unwrap();
next() 函数从迭代器中获取下一个元素
在 Rust 中,“unwrap” 表示“给我计算的结果,如果出现错误,就会产生异常并停止程序。”
如何在不使用字符串的其余部分的情况下获取字符串的第一个字符:
let text = "hello world!";
let ch = text.chars().take(1).last().unwrap();
head
和tail
一起工作(但不完全匹配实现)。pub fn head_tail<T: Iterator, O: FromIterator<<T>::Item>>(iter: &mut T) -> (Option<<T>::Item>, O) {
(iter.next(), iter.collect::<O>())
}
使用方法:
// works with Vec<i32>
let mut val = vec![1, 2, 3].into_iter();
println!("{:?}", head_tail::<_, Vec<i32>>(&mut val));
// works with chars in two ways
let mut val = "thanks! bedroom builds YT".chars();
println!("{:?}", head_tail::<_, String>(&mut val));
// calling the function with Vec<char>
let mut val = "thanks! bedroom builds YT".chars();
println!("{:?}", head_tail::<_, Vec<char>>(&mut val));
注意:head_tail函数在迭代器为空时不会引发
panic!
。如果这与Haskell的head/tail输出匹配,则在迭代器为空时将引发异常。使用可迭代特性可能也是更兼容其他类型的好方法。
被接受的答案有点丑陋!
let text = "hello world!";
let ch = &text[0..1]; // this returns "h"
&"日本語"[0..1]
。 - Shepmasterworld
would be a slice that contains a pointer to the 6th byte of s
and a length value of 5",重点标出),稍后在更详细的内容中会有更详细的讲解。 - Shepmaster
n
个代码单元,但是char_at
返回从字节n
开始的代码单元。后者更有用,因为大多数字符串操作都涉及字节索引。这相当于char_at
(也是常数时间):text[i..].chars().next().unwrap()
。 - user395760char_at
略有风险,因为索引可能位于一个代码单元内。 - Matthieu M.