gpt4 book ai didi

rust - 有没有一种方法可以为所有引用类型的迭代器通用地实现一个特征?

转载 作者:行者123 更新时间:2023-11-29 07:43:53 24 4
gpt4 key购买 nike

我有一个特点

trait Foo<T> : Iterator<Item=T> {
fn bar(&mut self) -> f64;
}

我想为类型 T(在我的例子中是 f64)实现一次这个特性,覆盖它的所有引用类型(f64&'a f64&'a mut f64),因为逻辑上这无关紧要。

我现在有

impl<T: Iterator<Item = f64>> Foo<f64> for T {
fn bar(&mut self) -> f64 {
// duplicated code
}
}

impl<'a, T: Iterator<Item = &'a f64>> Foo<&'a f64> for T {
fn bar(&mut self) -> f64 {
// duplicated code
}
}

impl<'a, T: Iterator<Item = &'a mut f64>> Foo<&'a mut f64> for T {
fn bar(&mut self) -> f64 {
// duplicated code
}
}

有没有好的方法可以做到不重复?

最佳答案

您可以使用 Borrow 为此的特质。如果您查看文档页面中的实现者,前三个在这里是相关的:这意味着 f64 , &'a f64&'a mut f64所有工具Borrow<f64> .您必须调用 borrow 迭代器产生的每个值上的方法以获得 &f64 .

use std::borrow::Borrow;

impl<T> Foo<T::Item> for T
where T: Iterator,
T::Item: Borrow<f64>
{
fn bar(&mut self) -> f64 {
unimplemented!()
}
}

顺便说一下,在 trait 上定义类型参数并同时在该类型参数和 supertrait 的关联类型之间设置约束实际上没有意义。 A型T只能有一个 Iterator 的实现, 因此它只能有一个 Foo 的实现同样,尽管类型参数表明它可以实现许多不同的 Foo<T>特质。因此,Foo 上的类型参数是完全多余的(您可以只使用 super 特征的关联类型而不是类型参数)。因此代码应该更像这样:

use std::borrow::Borrow;

trait Foo: Iterator {
fn bar(&mut self) -> f64;
}

impl<T> Foo for T
where T: Iterator,
T::Item: Borrow<f64>
{
fn bar(&mut self) -> f64 {
unimplemented!()
}
}

关于rust - 有没有一种方法可以为所有引用类型的迭代器通用地实现一个特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39989581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com