Types 什么样的数据类型可以使函数在Rust中的迭代器之间进行尽可能多的复制?

Types 什么样的数据类型可以使函数在Rust中的迭代器之间进行尽可能多的复制?,types,rust,iterator,Types,Rust,Iterator,我通常需要在两个iTerable之间复制数据。除此之外,我发现标准库中没有合适的函数,因此我尝试编写自己的函数: fn copy(source: /* ? */, target: /* ? */) { for (s, t) in source.zip(target) { *t = s.clone(); } } 要使此函数尽可能多用,正确的数据类型选择是什么 这似乎并不是非常有用,因为它限制了您关闭输入项。调用方可以使用cloned()或copied()来调整迭代

我通常需要在两个iTerable之间复制数据。除此之外,我发现标准库中没有合适的函数,因此我尝试编写自己的函数:

fn copy(source: /* ? */, target: /* ? */) {
    for (s, t) in source.zip(target) {
        *t = s.clone();
    }
}
要使此函数尽可能多用,正确的数据类型选择是什么

这似乎并不是非常有用,因为它限制了您关闭输入项。调用方可以使用
cloned()
copied()
来调整迭代器

唯一真正必要的约束应该是您可以将源项分配给目标项

我猜它看起来像

fn拷贝(源:S,目标:T)
哪里
迭代器,
T:迭代器,
TI:DerefMut,
{
对于source.zip(target)中的(s,mut){
*t=s;
}
}
但坦率地说,对于极少数需要做这种事情的情况,我宁愿只编写命令式循环

这似乎并不是非常有用,因为它限制了您关闭输入项。调用方可以使用
cloned()
copied()
来调整迭代器

唯一真正必要的约束应该是您可以将源项分配给目标项

我猜它看起来像

fn拷贝(源:S,目标:T)
哪里
迭代器,
T:迭代器,
TI:DerefMut,
{
对于source.zip(target)中的(s,mut){
*t=s;
}
}

但坦率地说,对于极少数需要执行此操作的情况,我宁愿编写命令式循环。

您能提供一个使用此操作的示例吗?特别是,如果目标迭代器不是一个切片,那么它将是什么呢?我认为一个更常见的用例将在本文中介绍。也许这就是你要找的东西?我猜你的经验主要是C++。Rype迭代器与Python或其他现代语言中的迭代器更紧密相关,而不是C++(生成器类,而不是光标类)。正如Masklin的回答所示,您可以在Rust中使用“输出迭代器”,但这不是一种常见的方法。我怀疑大多数Rustacean人只会编写循环。为什么不直接实现
clone()
?它将完全执行您想要的操作,而不会弄乱迭代器。@从源容器到目标容器的糖类型转换在这里是不合理的,因为目标容器包含源容器中未反映的其他数据。目标迭代器只是迭代容器的某个部分。另外,这是关于更新现有目标,而不是构建新目标。您能否提供一个示例,说明何时使用此操作?特别是,如果目标迭代器不是一个切片,那么它将是什么呢?我认为一个更常见的用例将在本文中介绍。也许这就是你要找的东西?我猜你的经验主要是C++。Rype迭代器与Python或其他现代语言中的迭代器更紧密相关,而不是C++(生成器类,而不是光标类)。正如Masklin的回答所示,您可以在Rust中使用“输出迭代器”,但这不是一种常见的方法。我怀疑大多数Rustacean人只会编写循环。为什么不直接实现
clone()
?它将完全执行您想要的操作,而不会弄乱迭代器。@从源容器到目标容器的糖类型转换在这里是不合理的,因为目标容器包含源容器中未反映的其他数据。目标迭代器只是迭代容器的某个部分。另外,这是关于更新现有目标,而不是构建新目标。
IntoIterator
将使其更通用(让您可以执行
copy(foo,&mut-bar)
而不是
copy(foo.into\u-iter(),bar.iter\u-mut())
。我强烈反对。这将使调用方更方便,因为您可以将任何
传递给迭代器
,但它不会改变函数的功能,只会使签名复杂化并增加代码膨胀。公平点,从这个意义上讲,它并没有使函数变得更通用,因为您可以始终在调用者中将
.放入iter
,但它不会使签名变得更复杂(实际上只是将
迭代器
更改为
迭代器
),我不确定它在哪些方面会导致膨胀。在我看来,这似乎是喜欢
IntoIterator
的一个很好的理由,而在这里没有很好的理由喜欢
IntoIterator
IntoIterator
会使这更一般(让你做
copy(foo,&mut bar)
而不是
复制(foo.into\u iter(),bar.iter\u mut())
),我强烈反对。这将使调用方更方便,因为您可以将任何
传递给迭代器
,但它不会改变函数的功能,只会使签名复杂化并增加代码膨胀。公平点,从这个意义上讲,它并没有使函数变得更通用,因为您可以始终在调用者中将
.放入iter
,但它不会使签名变得更复杂(实际上只是将
迭代器
更改为
迭代器
),我不确定它在哪些方面会导致膨胀。在我看来,这似乎是一个选择迭代器的好理由,而在这里没有选择迭代器的好理由。
s.clone()