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声明为mutablelet mut buffer:&mut[u8]=&mut[0u8;34]代码>&[u8]
可以,因为&'frame T
与T:AsRef&buffer
一起使用而不是&mut buffer
也可以工作。原因是处理ip\U有效负载需要和
。您通过&mut[u8]
。统一使T成为未大小化的[u8]
。