编写具有关联类型作为参数的递归特征方法时出错
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
实现 Node
,x.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
,但也可能有其他的可能性,所以它不能被静态解析并且被禁止。
我一直在更新库以使用 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
实现 Node
,x.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
,但也可能有其他的可能性,所以它不能被静态解析并且被禁止。