Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么我会得到这个错误;未实现特征“迭代器”;对于泛型类型的引用,即使它实现了IntoIterator?_Rust_Traits - Fatal编程技术网

Rust 为什么我会得到这个错误;未实现特征“迭代器”;对于泛型类型的引用,即使它实现了IntoIterator?

Rust 为什么我会得到这个错误;未实现特征“迭代器”;对于泛型类型的引用,即使它实现了IntoIterator?,rust,traits,Rust,Traits,在下面的示例中,MyTrait将扩展为迭代器,但编译器在循环中使用时无法识别它 pub trait MyTrait:IntoIterator{ fn foo(和self); } 发布fn运行(my:&M){ 在我的{ println!(“{}”,a); } } 我得到一个错误: 错误[E0277]:`&M`不是迭代器 -->src/lib.rs:6:14 | 6 |在我的{ |^^`&M`不是迭代器 | =帮助:特性“迭代器”未为“&M”实现` =注意:由于“&M”的“IntoIterator

在下面的示例中,
MyTrait
扩展为迭代器
,但编译器在循环中使用时无法识别它

pub trait MyTrait:IntoIterator{
fn foo(和self);
}
发布fn运行(my:&M){
在我的{
println!(“{}”,a);
}
}
我得到一个错误:

错误[E0277]:`&M`不是迭代器
-->src/lib.rs:6:14
|
6 |在我的{
|^^`&M`不是迭代器
|
=帮助:特性“迭代器”未为“&M”实现`
=注意:由于“&M”的“IntoIterator”impl上的要求,因此需要`
=注:由“进入”iter要求`

只有
M
实现了
到迭代器中
,但是您尝试在
&M
上进行迭代,而这并不一定需要

不清楚您希望通过运行
实现什么,但删除引用可能是一个开始:

pub fn run<M: MyTrait>(my: M) {
    for a in my {
        println!("{}", a);
    }
}
这使用
.copied()
迭代器
转换为
迭代器

相关问题

仔细阅读错误消息:
O
是可移植的,但
&O
不是。我认为这是问题所在,但事实并非如此,我用&Vec替换了&V,它工作了。这是因为
&Vec
实现了
IntoIterator
…这不仅仅是语法上的一个怪癖:
IntoIterator::into_iter()
获取
self
,即需要使用调用它的值。如果您只有一个对对象的引用,那么它实现
IntoIterator
的事实是无用的,因为您无法使用引用来使用该对象。
&Vec
提供了一个单独的
IntoIterator
实现,该调用非常简单s
self.iter()
并返回一个迭代器,该迭代器生成对向量元素的引用。因此我不确定如何解决它,是否需要为
&OtherTrait
实现
迭代器
?但是@trentcl这是所有问题,即使我包装
&OtherTrait
,我仍然需要以某种方式迭代
&OtherTrait
@GuyKorland the question没有包含足够的上下文来理解您试图如何使用它。从
MyEnum
中删除
&'a
。我不知道您可能需要做哪些其他更改来编译其余的代码,因为我不知道代码的其余部分是什么样子的。我试图做的只是传递一个借用的特征并对其进行迭代。简化example@GuyKorland简化示例的解决方案是相同的:。您不能通过引用使用
intoierator
。但仍然可以使用引用(以及包含引用的结构)它们本身实现了
IntoIterator
:。我也许应该补充一点,原则上你可以用一个更高等级的特征边界来解决这个问题;但是,因为,它,即使它实现了,它仍然不能与
M=Vec
一起工作,因为
&Vec
没有实现
IntoIterator
(它将
实现为迭代器
——注意
&
)。
impl<I> MyTrait for I
where
    I: IntoIterator<Item = i32>,
{
    fn foo(&self) {}
}

fn main() {
    let v = vec![10, 12, 20];
    run(v.iter().copied());
}