程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为 dyn Fns 实现特征大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为 dyn Fns 实现特征?

开发过程中遇到为 dyn Fns 实现特征的问题如何解决?下面主要结合日常开发的经验,给出你关于为 dyn Fns 实现特征的解决方法建议,希望对你解决为 dyn Fns 实现特征有所启发或帮助;

今天我在玩弄函数特性。尽管我在下面展示的示例实际上可能不是很有用,但我确实想知道为什么它不能编译。

@H_874_4@pub fn do_something(o: &(dyn Other + 'statiC)) { } Trait Other { fn do_something_other(&self); } impl<A> Other for dyn Fn(A) { fn do_something_other(&self) { do_something(self); } }

这里我为一个函数类型实现了一个特征。此函数类型在其参数上是通用的。这意味着如果你这样做:

@H_874_4@pub fn do_something(o: &(dyn Other + 'statiC)) { } Trait Other { fn do_something_other(&self); } impl<F,A> Other for F where F: (Fn(A)) + 'static { fn do_something_other(&self) { do_something(self); } }

您收到一个错误,指出类型参数不受约束。

为 dyn Fns 实现特征

我明白这一点,但不相信用泛型来做到这一点。但是动态方法,为什么不起作用呢?它给出了以下错误:

为 dyn Fns 实现特征

我不明白这个错误。它声明我传递了一个 Fn(A) -> (),它没有实现 Other。但是,此错误确实发生在 Other 的实现中。这里怎么能不实现?

我的第一个想法是因为每个闭包都是它自己的类型。如果与此有关,我觉得这个错误很奇怪

解决方法

第一个构造失败,因为您无法将 &dyn A 转换为 &dyn B,即使在为 B 实现 dyn A 时也是如此。

Trait A {}

Trait B {
    fn do_thing(&self);
}

impl B for dyn A {
    fn do_thing(&self) {
        let b: &dyn B = self;
    }
}
error[E0308]: mismatched types
 --> src/lib.rs:9:25
  |
9 |         let b: &dyn B = self;
  |                ------   ^^^^ expected Trait `B`,found Trait `A`
  |                |
  |                expected due to this
  |
  = note: expected reference `&dyn B`
             found reference `&(dyn A + 'statiC)`

好吧,您可以转换特征,但只能在源特征的帮助下进行。但由于在这种情况下源是 Fn,所以这不是路由。


第二个构造失败,因为 Rust 不会让你实现可能发生冲突的 Trait。尝试为实现 B 的类型实现 A<_> 将自动被拒绝,因为类型可以有多个 A<_> 实现。

Trait A<T> {}

Trait B {
    fn do_thing(&self);
}

impl<T,U> B for T where T: A<U> {
    fn do_thing(&self) {}
}
error[E0207]: the type parameter `U` is not consTrained by the impl Trait,self type,or preDicates
 --> src/lib.rs:7:9
  |
7 | impl<T,U> B for T where T: A<U> {
  |         ^ unconsTrained type parameter

特别是关于 Fns,它有点难以判断,因为通常函数对象只实现一个 Fn 特性。但是,关键字通常,因为您可以在每晚启用一个功能来做到这一点。而且特质系统通常不会播放收藏夹。


那你能做什么?好吧,第一种方法仍然是功能性,只是您必须将实现保留在 Trait 中。如果对函数参数使用具体类型,则可以使用第二种方法。

可以想象,您可以为 Other 实现 &dyn Fn(_)(在引用而不是对象本身上实现它)。但这对于通常使用 Fn 对象的方式来说并不是特别方便

pub fn do_something(o: &dyn Other) {}

Trait Other {
    fn do_something_other(&self);
}

impl<A> Other for &dyn Fn(A) {
    fn do_something_other(&self) {
        do_something(self);
    }
}

fn main() {
    // THIS WORKS
    let closure: &dyn Fn(_) = &|x: i32| println!("x: {}",X);
    closure.do_something_other();
    
    // THIS DOESN'T WORK
    // let closure = |x: i32| println!("x: {}",X);
    // closure.do_something_other();
}

另一种选择是使 Other Trait 通用以约束 A,但这当然取决于它的设计用途。

大佬总结

以上是大佬教程为你收集整理的为 dyn Fns 实现特征全部内容,希望文章能够帮你解决为 dyn Fns 实现特征所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: