try_into() 在 u8 上使用时中断
try_into() is breaking when used on 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 变量,但不太确定这是否是我应该尝试下去的兔子洞。
完整代码:
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(),
}
}
}
您的代码 compiles successfully 当前稳定版本 (v1.51)。
但是,切片的 TryFrom<Vec<_>>
(允许您使用 try_into()
)只有 added in rust 1.48,所以也许您是 运行 早于 1.48 的 Rust 版本。如果是这样,更新到 1.48+ 应该可以解决您的问题。
所以我对这个脚本没有太多的了解,作为一个更大的 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 变量,但不太确定这是否是我应该尝试下去的兔子洞。
完整代码:
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(),
}
}
}
您的代码 compiles successfully 当前稳定版本 (v1.51)。
但是,切片的 TryFrom<Vec<_>>
(允许您使用 try_into()
)只有 added in rust 1.48,所以也许您是 运行 早于 1.48 的 Rust 版本。如果是这样,更新到 1.48+ 应该可以解决您的问题。