不同类型的 string.chars(),用于 .next() 和 .peek()
Different types of string.chars(), for .next() and .peek()
我正在尝试使用 string.chars().peekable()
,但我遇到的问题是我的类型与 .next()
和 .peek()
不同。一个是Option<char>
,第二个是Option<&char>
,比较麻烦
我的代码是(s
是String
):
let mut left_iter = s.chars().peekable();
let mut right_iter = s.chars().rev().peekable();
loop {
let left = left_iter.next();
let right = right_iter.next();
let left_next = left_iter.peek();
let left_right = right_iter.peek();
if left == right || left == right_next {
...
}
我得到的错误很明显:
预期 &char
,发现 char
但是我找不到一种方法让 next()
和 peek()
具有相同的类型而没有 re/deconstructing 选项。
有没有一种干净的方法可以让两个 return 值具有相同的类型?
你有两个选择 取消引用 (&T
-> T
) 一个或 引用 (T
-> &T
) 其他:
取消引用
由于它们被包装在 Option
中,您可以 zip
它们并使用映射、模式匹配或取消引用引用的对象进行操作,否则 return false
。 :
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", right.zip(left).map(|(&r, l)| r == l).unwrap_or(false));
}
或者由于 char
是 Copy
,您可以使用 Option::copied
:
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left == right.copied());
}
引用
此外,也许更简单,您可以使用 as_ref
从 Option<T>
:
获取 Option<&T>
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left.as_ref() == right);
}
我正在尝试使用 string.chars().peekable()
,但我遇到的问题是我的类型与 .next()
和 .peek()
不同。一个是Option<char>
,第二个是Option<&char>
,比较麻烦
我的代码是(s
是String
):
let mut left_iter = s.chars().peekable();
let mut right_iter = s.chars().rev().peekable();
loop {
let left = left_iter.next();
let right = right_iter.next();
let left_next = left_iter.peek();
let left_right = right_iter.peek();
if left == right || left == right_next {
...
}
我得到的错误很明显:
预期 &char
,发现 char
但是我找不到一种方法让 next()
和 peek()
具有相同的类型而没有 re/deconstructing 选项。
有没有一种干净的方法可以让两个 return 值具有相同的类型?
你有两个选择 取消引用 (&T
-> T
) 一个或 引用 (T
-> &T
) 其他:
取消引用
由于它们被包装在 Option
中,您可以 zip
它们并使用映射、模式匹配或取消引用引用的对象进行操作,否则 return false
。 :
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", right.zip(left).map(|(&r, l)| r == l).unwrap_or(false));
}
或者由于 char
是 Copy
,您可以使用 Option::copied
:
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left == right.copied());
}
引用
此外,也许更简单,您可以使用 as_ref
从 Option<T>
:
Option<&T>
fn main() {
let left = Some('c');
let right = Some(&'c');
println!("{}", left.as_ref() == right);
}