谁能给我解释一下这个声明中的|slice|
是如何工作的?来源(35):https://gist.github.com/madhavanmalolan/b30b47640449f92ea00e4075d63460a6
let amount = rest_of_data
.get(..8)
.and_then(|slice| slice.try_into().ok())
.map(u64::from_le_bytes)
.unwrap();
这段代码尝试将字节数组转换为u64
。
let amount = rest_of_data // &[u8]
.get(..8) // Option<&[u8]>
.and_then(|slice /* &[u8] */ | slice.try_into().ok()) // Option<[u8; _]>
.map(u64::from_le_bytes) // Option<u64>
.unwrap();
rest_of_data
为[u8]
的引用。get(..8)
方法尝试获取rest_of_data
的前8个元素,返回Option<&[u8]>
(如果片中至少有8个元素,则返回Some
,如果片中少于8个元素,则返回None
)
至于你的问题;
要使用u64::from_le_bytes
将一些字节转换为u64
,您的输入需要是一个拥有的值,而不是引用。通过在Option<&[u8]>
上调用.and_then(f)
,你给闭包f
Some(val)
中的val
,在这种情况下它是&[u8]
。闭包f
接受一个参数(在本例中名为slice
)并返回闭包结果。然后用.map()
方法将这个返回值馈送给u64::from_le_bytes
。
由于u64::from_le_bytes
接受一个拥有的值,因此需要将字节片转换为拥有的类型,这就是闭包对.try_into()
函数所做的。它给你一个字节数组。