Rust 为什么要重新下载&;mut[u8]在编译时使其大小未知?

Rust 为什么要重新下载&;mut[u8]在编译时使其大小未知?,rust,Rust,我正在创建一个可变的[u8]缓冲区,如下所示: let buffer: &mut [u8] = &mut [0u8; 34]; 在这里使用: repr.emit(&mut *buffer, &caps.checksum); 然后在这里重新浏览: assert_eq!(processor!(iface).process_ip_payload(&mut ip, &mut socket_set, Instant::from_millis(0), &a

我正在创建一个可变的
[u8]
缓冲区,如下所示:

let buffer: &mut [u8] = &mut [0u8; 34];
在这里使用:

repr.emit(&mut *buffer, &caps.checksum);
然后在这里重新浏览:

assert_eq!(processor!(iface).process_ip_payload(&mut ip, &mut socket_set, Instant::from_millis(0), &mut *buffer), Ok(Some(expected_repr)));
我得到:

编译时无法知道
[u8]
类型的值的大小

在编译时没有已知的大小

对于
…,&mut*buffer)
重新加载(最后一个,在断言时)

原始缓冲区的大小在编译时已知。为什么重新加载会导致大小未知

以下是所需的签名:

    pub fn emit<T: AsRef<[u8]> + AsMut<[u8]>>(
        &self,
        buffer: T,
        _checksum_caps: &ChecksumCapabilities,
    )
    fn process_ip_payload<'frame, T: AsRef<[u8]>>(
        &mut self,
        ip: &mut ip::Processor,
        sockets: &mut SocketSet,
        timestamp: Instant,
        frame: &'frame T,
    ) -> Result<Option<ip::Packet<'frame>>>
pub-fn-emit(
&自我,
缓冲区:T,
_校验和上限:&checksum功能,
)

fn process_ip_payload Result当您将其作为参数传入时,不要取消引用
缓冲区

assert_eq!(processor!(iface).process_ip_payload(
    &mut ip, &mut socket_set, Instant::from_millis(0), &mut buffer),
    Ok(Some(expected_repr)));

&mut buffer
而不是
&mut*buffer
)。

这不会让我通过一个
&[u8]
?无论如何,我得到的
不能借用
buffer`作为可变的,因为它不是为
声明为可变的。&但是buffer
@Guerlando:我认为你几乎是对的,应该是
&mut&mut[u8]
。如果您将变量buffer声明为mutable
let mut buffer:&mut[u8]=&mut[0u8;34]
&[u8]
可以,因为
&'frame T
T:AsRef
&buffer
一起使用而不是
&mut buffer
也可以工作。原因是
处理ip\U有效负载
需要
。您通过
&mut[u8]
。统一使T成为未大小化的
[u8]