在一个接收&str
并返回impl Iterator<Item = char>
的函数内,我正在尝试将输入转换为小写形式,然后过滤和映射这个小写形式的字符。但是在使用str.to_lowercase()
时遇到了以下错误:
--> src/lib.rs
|
| cipher
| _____^
| |_____|
| ||
| || .to_lowercase()
| ||_______________________- temporary value created here
| | .chars()
| | .filter(|c| c.is_alphanumeric() && c.is_ascii())
... |
| | }
| | })
| |___________^ returns a value referencing data owned by the current function
原始形式的函数:
pub fn decode_to_iter(cipher: &str) -> impl Iterator<Item = char> {
cipher
.to_lowercase()
.chars()
.filter(|c| c.is_alphanumeric() && c.is_ascii())
.map(|c| {
if c.is_alphabetic() {
(((b'z' - (c as u8)) + b'a') as char)
} else {
c
}
})
}
我在网上看到了一些关于如何返回使用
.to_lowercase()
转换过的拥有值的类似问题的提问,但是所有已发布的解决方案都不能满足我的需求。我试图避免使用
&char
并坚持在我的返回类型中使用char
。我尝试使用
.to_owned()
等函数来获取对引用的所有权,但却一无所获。最终,我使用
char.to_ascii_lowercase()
使我的函数编译通过并通过了我的测试。我的函数的工作版本是:pub fn decode_to_iter<'a>(cipher: &'a str) -> impl Iterator<Item = char> + 'a {
cipher
.chars()
.filter(|c| c.is_alphanumeric() && c.is_ascii())
.map(|c| {
if c.is_alphabetic() {
(((b'z' - (c.to_ascii_lowercase() as u8)) + b'a') as char)
} else {
c.to_ascii_lowercase()
}
})
}
让我最困惑的事情之一是 str.to_lowercase()
和 char.to_ascii_lowercase()
之间的区别。根据 字符原始类型 下的文档,.to_ascii_lowercase()
的显示:
pub fn to_ascii_lowercase(&self) -> char
在 基本类型 Str 下,对于 .to_lowercase()
的文档显示:
pub fn to_lowercase(&self) -> String
除非我误解了,这两个函数似乎都会返回一个所有权值,所以我不确定为什么只有char.to_ascii_lowercase()
有效。
我在想:
如何正确返回使用
.to_lowercase()
而不是.to_ascsii_lowercase()
的Impl Iterator
值?char.to_lowercase()
和str.to_ascii_lowercase()
之间的区别是什么?
chars()
借用了字符串。 - Boiethios