当前位置: 首页 > 知识库问答 >
问题:

如何明确地告诉Rust编译器数组片的长度?[副本]

广楚
2023-03-14

让我们假设我有以下切片(代码不编译):

struct Data {
  data: Vec<u8>
}

impl Data {

  pub fn parse_ipv4(&self) -> Ipv4Addr {
    let octets: [u8; 4] = self.data[2..6]; // this does not compile
    Some(Ipv4Addr::from(octets));
  }
}

问题是编译器无法推断数据片的usize,因此如何明确告诉它新数组的长度?


共有1个答案

乐欣可
2023-03-14

关键是TryTo。看起来你应该返回选项

use std::net::Ipv4Addr;
use std::convert::TryInto;

struct Data {
    data: Vec<u8>
}

impl Data {
    pub fn parse_ipv4(&self) -> Option<Ipv4Addr> {
        let octets: Result<[u8; 4], _> = self.data[2..6].try_into();
        octets.map(Ipv4Addr::from).ok()
    }
}

 类似资料:
  • 我有一个包含原始二进制数据的文件,我想把它加载到一个4字节长的字数组中。 可以通过在编译时包含文件的内容来执行: 然后,我可以使用将其转换为字的数组。新数组的长度显然应该是原始字节数组的1/4。 正如你在上面看到的,我必须对输入和输出数组的长度进行硬编码。然而,当试图避免硬编码这些数字时,它不起作用: 似乎在运行时被调用,由于在Rust中无法分配动态数组,因此会产生错误。然而,理论上,应该有一种方

  • 我知道切片就像fatptr:。将数组切片为切片时: 数组没有像Vec这样的长度字段 我知道可以获取slice的长度,因为有一个长度字段。当数组转换为切片时,Rust如何知道长度字段?

  • 明确编译器警告和错误 编译器是一个机器人,它会标记你代码中被 Clang 规则定义为错误的地方。但是,你总是比 Clang 更聪明。通常,你会发现一些讨厌的代码会导致这个问题,但是暂时却解决不了。你可以这样明确一个错误: - (NSInteger)divide:(NSInteger)dividend by:(NSInteger)divisor { #error Whoa, buddy, y

  • 问题内容: 我有一个快速的问题。我在java中有一个整数数组,需要它的长度在整个类中变化。具体来说,在某些情况下,我需要将其增加一。我这样尝试过。 我会在需要时增加整数变量numberOfSBG,但我认为这不起作用。还有其他办法吗? 问题答案: 我建议您使用ArrayList,因为您不必担心长度。创建后,您将无法修改数组大小: 数组是一个包含固定数量的单一类型值的容器对象。创建数组时将确定数组的长

  • 如图所示,我在主函数之前定义了哈希函数,现在他却回答我“hash”不明确,我不理解