try_into() 在 u8 上使用时会中断

问题描述

所以我对这个脚本没有很多了解,作为 ARM 的一个更大项目的一部分进行编译。这来自主要为 x86 设计的 zksync 库。

我在编译时不断遇到转换错误

7 |         .try_into()
  |          ^^^^^^^^ the trait `std::convert::From<std::vec::Vec<u8>>` is not implemented for `[u8; 16]`

我尝试使用 try_from() 尽可能多的搜索推荐,但无法让它运行,因为我对 Rust 还是很陌生,但如果有人可以让它工作,我愿意接受。

我正在使用以下目标和链接器进行编译 -

目标 - arm-unkNown-linux-musleabi 链接器 - arm-linux-gnueabihf-ld

如果有人可以推荐如何解决这个问题,我很想听听,我在考虑使用 usize 而不是 u64 vars,但无法弄清楚这是否是我应该尝试下去的兔子洞。

>

完整代码

use serde::{Deserialize,Serialize};
use std::convert::TryInto;

/// Defines time range `[valid_from,valid_until]` for which transaction is valid,/// time format is the same as Ethereum (UNIX timestamp in seconds)
#[derive(Debug,Clone,copy,Serialize,Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TimeRange {
    pub valid_from: u64,pub valid_until: u64,}

impl TimeRange {
    pub fn new(valid_from: u64,valid_until: u64) -> Self {
        Self {
            valid_from,valid_until,}
    }

    pub fn to_be_bytes(&self) -> [u8; 16] {
        [
            self.valid_from.to_be_bytes(),self.valid_until.to_be_bytes(),]
        .concat()
        .try_into()
        .expect("valid_from and valid_until should be u64")
    }

    pub fn check_correctness(&self) -> bool {
        self.valid_from <= self.valid_until
    }

    pub fn is_valid(&self,block_timestamp: u64) -> bool {
        self.valid_from <= block_timestamp && block_timestamp <= self.valid_until
    }
}

impl Default for TimeRange {
    fn default() -> Self {
        Self {
            valid_from: 0,valid_until: u64::max_value(),}
    }
}

解决方法

您在当前稳定版本 (v1.51) 上的代码 compiles successfully。 但是,切片的 TryFrom<Vec<_>>(允许您使用 try_into())仅为 added in rust 1.48,因此您可能正在运行 1.48 之前的 Rust 版本。如果是这样,更新到 1.48+ 应该可以解决您的问题。