我试着打印我插入的一些基本数据的编码十六进制字符串,作为如何序列化/反序列化数据的一课。然而,要做到这一点,im必须为一个具有Vec类型的单个元素的Struct实现一个迭代器。我得到了下面的错误,不明白为什么,我意识到我的代码在下一个()实现中是不完整的。我对迭代器相当陌生,任何帮助都将不胜感激。
错误:
error[E0599]: no method named `iter_mut` found for struct `MyData` in the current scope
--> src/main.rs:110:22
|
21 | pub(crate) struct MyData {
| ------------------------ method `iter_mut` not found for this struct
...
110 | for v in my_data.iter_mut() {
| #[derive(Serialize, Deserialize, Debug)]
#[serde(transparent)]
struct MyHex {
#[serde(with = "hex::serde")]
hex: Vec<u8>,
}
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct MyData {
data: Vec<MyHex>,
}
impl Iterator for MyData {
type Item = usize;
fn next(&mut self) -> Option<Self::Item>;
}
fn main() -> Result<()> {
let data = "
{
\"data\": [\"bbac4013c1ca3482155b584d35dac185\",
\"a08898e81f1ddb6612aa12641b856aa9\",
\"bbac4013c1ca3482155b584d35dac185\"
]
}";
let my_data: MyData = serde_json::from_str(data)?;
for v in my_data.iter_mut() {
println!("{:?}", hex::encode(v));
}
return Ok(());
}发布于 2022-11-30 08:42:34
你的问题有点模糊,但让我们看看我们能做些什么:
迭代内场
如果要逐字节处理数据,可以迭代数据本身:
for hex in my_data.data { ... }迭代而不公开内部字段
您还可以通过data返回迭代器,而无需将字段公开给其余代码:
impl MyData {
fn iter_data(&self) -> impl Iterator<Item = &MyHex> {
self.data.iter()
}
}
...
for hex in my_data.iter_data() { ... }实现IntoIterator
如果希望MyData作为迭代器工作,可以为其实现IntoIterator特性:
impl<'a> IntoIterator for &'a MyData {
type Item = &'a MyHex;
type IntoIter = std::slice::Iter<'a, MyHex>;
fn into_iter(self) -> Self::IntoIter {
self.data.iter()
}
}
...
for v in &my_data {
println!("{:?}", v);
}Iterator在MyData中的实现
要实现Iterator,您需要提供next方法,在每次调用时,该方法将返回迭代器中的下一个项,而此时仍有任何项。要做到这一点,您需要向MyData中添加一个字段,该字段跟踪返回的最后一个项,并在每次调用next()时增加该指针。
但是从你的代码来看,我想这不是你真正想要的东西。选择前面的选项之一。
https://stackoverflow.com/questions/74623532
复制相似问题