【发布时间】:2015-11-09 03:51:33
【问题描述】:
总的来说,我的目标是:
- 对于一些已知类型的 Bar...
- 有一个特征 Foo 和一个函数:
get_iterator<T>() -> T where T: Iterator<Item = Bar> - 迭代器的实例借用了实现 Foo 的原始对象。
我想它是这样工作的:
let mut foo = Foo;
let bar = foo.get_iterator();
foo.mutable_call(); // <-- This fails, because foo is borrowed in bar
for x in bar {
...
}
所以,这就是目标,这是我的尝试,我似乎无法开始工作:
struct ValsFromT<'a, T: 'a> {
parent:&'a T,
offset: usize,
}
struct Val;
trait HasValsIterator<T> {
fn val_iterator(&self) -> T where T: Iterator<Item = Val>;
}
struct Foo;
impl<'a> Iterator for ValsFromT<'a, Foo> {
type Item = Val;
fn next(&mut self) -> Option<Val> {
return None;
}
}
impl<'a> HasValsIterator<ValsFromT<'a, Foo>> for Foo {
fn val_iterator(&'a self) -> ValsFromT<'a, Foo> {
return ValsFromT {
offset: 0usize,
parent: self
};
}
}
fn takes_vals<T>(instance:T) where T: HasValsIterator<T> {
// ...
}
#[test]
fn test_foo() {
let x = Foo;
takes_vals(x);
}
(游戏笔:http://is.gd/wys3fx)
我们在这里遇到了可怕的具体/绑定生命周期错误,因为试图从 trait 函数返回一个引用 self 的迭代器实例:
<anon>:22:3: 27:4 error: method `val_iterator` has an incompatible type for trait:
expected bound lifetime parameter ,
found concrete lifetime [E0053]
<anon>:22 fn val_iterator(&'a self) -> ValsFromT<'a, Foo> {
<anon>:23 return ValsFromT {
<anon>:24 offset: 0usize,
<anon>:25 parent: self
<anon>:26 };
<anon>:27 }
<anon>:22:3: 27:4 help: see the detailed explanation for E0053
有没有办法做到这一点?
【问题讨论】:
-
@Veedrac 哦,这只是语义,实际上并不是借用 self 的问题。如果你想把它变成答案,我会接受的~
标签: rust