问题描述
所以我对这个脚本没有很多了解,作为 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+ 应该可以解决您的问题。