Rust 为什么<;dyn Fn(dyn FNOCE(&;mut[u8]),usize)——>;结果<;(),()>+;发送+;同步>;不';我在编译时不知道syze 使用std::sync::Arc; 发布类型A=Arc结果+发送+同步>; 发布结构B{ a:a, }

Rust 为什么<;dyn Fn(dyn FNOCE(&;mut[u8]),usize)——>;结果<;(),()>+;发送+;同步>;不';我在编译时不知道syze 使用std::sync::Arc; 发布类型A=Arc结果+发送+同步>; 发布结构B{ a:a, },rust,Rust,给予 编译操场v0.0.1(/playerd) error[E0277]:类型为`(dyn for的值的大小该错误没有什么帮助,因为它将您指向类型的错误部分 dyn Fn有[a码] 与任何“裸”特征对象一样,dyn Fn没有大小。但是这是可以的,因为Arc不需要T:sized 问题是dyn-FnOnce(&mut[u8])未调整大小,因此您不能使用Fn(dyn-FnOnce(&mut[u8]),usize)。函数参数不允许未调整大小 将该函数参数设置为大小将解决问题,例如 use std::sy

给予

编译操场v0.0.1(/playerd)

error[E0277]:类型为`(dyn for的值的大小该错误没有什么帮助,因为它将您指向类型的错误部分

dyn Fn
有[a码]

与任何“裸”特征对象一样,
dyn Fn
没有大小。但是这是可以的,因为
Arc
不需要
T:sized

问题是
dyn-FnOnce(&mut[u8])
未调整大小,因此您不能使用
Fn(dyn-FnOnce(&mut[u8]),usize)
。函数参数不允许未调整大小

将该函数参数设置为大小将解决问题,例如

use std::sync::Arc;
pub type A = Arc<dyn Fn(dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;

pub struct B {
    a: A,
}
发布类型A=Arc结果+发送+同步>;
//^--已加入&

这是值得的,因此可以改进此错误消息。

错误消息(rust 1.50)

help:trait'Sized'没有为`(dyn for;
//或
发布类型A=Arc结果+发送+同步>;
我认为这只是。@trentcl可能,但请看。错误消息在整个类型下划线,而不仅仅是内部的
fnone
。而
&dyn fnone(…)
编译为类型定义,您将无法实际调用内部闭包,因为调用
FnOnce
需要使用闭包,如果闭包位于引用后面,这是不可能的。OP的另一个问题中概述了可能的解决方案OP解释了类型的预期用途。
pub type A = Arc<dyn Fn(&dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;
//                      ^--- added &
help: the trait `Sized` is not implemented for `(dyn for<'r> FnOnce(&'r mut [u8]) + 'static)`
note: only the last element of a tuple may have a dynamically sized type
pub type A = Arc<dyn Fn(&dyn FnOnce(&mut [u8]), usize) -> Result<(), ()> + Send + Sync>;
// or
pub type A = Arc<dyn Fn(usize, dyn FnOnce(&mut [u8])) -> Result<(), ()> + Send + Sync>;