pub fn copy_checked<R1, R2>(&'sdl mut self, path: &str, src: R1, dst: R2) -> Result<(), String>
where
R1: Into<Option<Rect>>,
R2: Into<Option<Rect>>,
{
RenderSystem::get_or_load_and_use( // closure arg here
|txt: &Texture<'_>| self.cc.canvas.copy(&txt, src, dst),
)
}
上述失败,因为R1和R2也需要复制特征。
cannot move out of `dst`, a captured variable in an `FnMut` closure
move occurs because `dst` has type `R2`, which does not implement the `Copy` trait
这使我不确定如何确切地实现生锈模板。如果就像C ++,那么不需要复制ARGS。该函数只会被列入编译。但是,如果它在执行副本,则意味着具有相同签名(ARGS和返回类型)的不同lambdas不需要具有不同的编译实例。他们可以具有相同的功能主体,但只使用了不同的功能指针。中摘要:是否具有相同原型(ARGS和返回类型)的闭合模板参数,但不同的身体算作不同类型的生物构造?
从关闭中的参考
闭合表达式产生一个闭合值,具有独特的匿名类型,无法写出
式匿名类型。因此,即使您通过类型为2。)RUST编译器确实使用单态化来编译仿制药 - 这意味着调用具有不同闭合的函数将为通过
3。)Rust不会等到单态化返回错误。实际上,目标是在单形化时间没有错误。取而代之的是,所有约束都必须在所有情况下必须保留。这是C ++模板和Rust Generics之间最大的不同。
R1
和R2
约束不是由于单态化(或缺乏),而是所有权问题。您正在将
R1
和R2
Copy
Copy
src
的闭合 - 可以多次称为
dst
,因此可以多次调用。您可以多次传递某事的所有权的唯一方法是实现
.copy
。因此,要进行编译,您需要添加一个约束,即get_or_load_and_use
和
FnMut
是
.copy
::
Copy
R1
,然后将克隆传递到
R2
::
Copy
请参阅复制和克隆之间的区别?