编写具有关联类型作为参数的递归特征方法时出错

Error when writing a recursive trait method with an associated type as an argument

我一直在更新库以使用 Rust 的新关联类型。该库提供了 Node 特征来构建 DSP 图。下面是该特征的简化版本,它会产生与我在我的库中 运行 相同的错误。

use std::default::Default;
use std::num::Float;

trait Node {
    type Output: Default + Float;

    fn inputs<N>(&mut self) -> Vec<&mut N>
        where
            N: Node<Output = <Self as Node>::Output>;

    fn output_requested(&mut self, output: &mut <Self as Node>::Output) {
        for input in self.inputs().into_iter() {
            let mut working: <Self as Node>::Output = Default::default();
            input.output_requested(&mut working);
            //    ^~~~~ ERROR
            *output = *output + working;
        }
    }

}

fn main() {}

这是错误信息

<anon>:15:19: 15:49 error: the type of this value must be known in this context
<anon>:15             input.output_requested(&mut working);
                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Playpen link - http://is.gd/xm0wvS

考虑到 self.inputs() returns N 其中 N: Node<Output = <Self as Node>::Output>,我的印象是 rustc 应该有足够的关于 input 的类型信息来满足调用 output_requested 方法?

非常感谢任何帮助!

首先:给定一个对象 x 实现 Nodex.inputs() 采用通用参数 N 和 returns Vec<&mut N>

现在让我们写出 output_requested 中发生的事情的更明确类型的版本。

(顺便说一下,有了 for 循环的新 IntoIterator 基础,.into_iter() 就不再需要了。)

fn output_requested(&mut self, output: &mut <Self as Node>::Output) {
    let inputs: Vec<&mut N> = self.inputs();
    for input in inputs {  // input: &mut N
        let mut working: <Self as Node>::Output = Default::default();
        input.output_requested(&mut working);
        *output = *output + working;
    }
}

好吧,那么;关于这种类型 N,我们能得出什么结论?我们能解决吗?

  • 它来自self.inputs(),引入它实现的约束Node<Output = <Self as Node>::Output>

  • 在对象上,你调用了方法self.output_requested(&mut <Self as Node>::Output),只是证实了前面的观点。

所以我们所知道的关于这个 N 的是它实现 Node 与我们的类型相同 Output。但这可能是两种完全不同的类型,像这样:

impl Node for A {
    type Output = Out;
    …
}

impl Node for B {
    type Output = Out;
    …
}

由此可见,无法确定N是什么;它总是可以是Self,但也可能有其他的可能性,所以它不能被静态解析并且被禁止。