问题描述
我已经found example了解了如何在 Rust 中实现 PyIterProtocol。
use pyo3::prelude::*;
use pyo3::PyIterProtocol;
use pyo3::class::iter::IterNextOutput;
#[pyclass]
struct Iter {
count: usize
}
#[pyproto]
impl PyIterProtocol for Iter {
fn __next__(mut slf: PyRefMut<Self>) -> IterNextOutput<usize,&'static str> {
if slf.count < 5 {
slf.count += 1;
IterNextOutput::Yield(slf.count)
} else {
IterNextOutput::Return("Ended")
}
}
}
但我不知道如何实现一个可迭代但本身不是迭代器的容器类。基本上我希望能够像在 Python 中分解我的对象
x,y,z = my_object
解决方法
来自the user guide on Iterator Types:
在许多情况下,您会区分被迭代的类型(即 iterable)和它提供的迭代器。在这种情况下,您应该为迭代器和迭代器都实现 PyIterProtocol
,但迭代器只需要支持 __iter__()
,而迭代器必须同时支持 __iter__()
和 __next__()
。