如何从以太调用中反序列化相同类型的多个值而不将所有值都列在元组中?

问题描述 投票:0回答:1

我正在使用一些返回字节的 API,我可以通过定义它们的类型来反序列化这些字节。

result: (f64, f64, f64) = api.call();

我可以通过动态传递元素数量的值 n 来实现相同的功能吗?

元组的所有元素都具有相同的类型。我想做这样的事情:

result: tuple(f64, 3) = api.call();

这里是调用函数的API。

编辑: 以防将来有人遇到这个问题。我可以通过采用这个解决方案来反序列化输出。

rust tuples deserialization
1个回答
2
投票

供参考:

call()
返回
Result<D: Detokenize, _>
Detokenize
主要针对所有实现
T
Tokenizable
实现。

这里列出了所有可以接收结果的类型。 请注意,除了各种大小的元组之外,它还实现用于:

impl<T: TokenizableItem + Clone, const N: usize> Tokenizable for [T; N]

此外,请注意,它是一个带有 
async

Result
函数,这意味着您必须
await
它并处理潜在的错误。
所以你应该(tm)能够写:

result: [f64; 3] = api.call().await.unwrap();

当然,在实际项目中,我建议用一些适当的错误处理来替换 
unwrap()

免责声明:我不知道如何使用其余的

ethers-core

,所以我无法在测试项目中验证这一点。此信息纯粹来自文档。


静态与动态尺寸

[f64; 3]

要求您在编译时知道元素的数量。

请注意,另一个 

Tokenizable

Vec<T>
,这意味着您还可以指定
Vec<T>
作为结果类型。然后,该长度将在运行时解析,具体取决于
T
返回的
api.call()
的元素数量。

更多背景信息

请注意,不存在具有 N 个 T 元素的元组,因为元组不是一种类型的重复,而是类型的集合。元组的每个元素都可以有不同的类型。

如果你想表示一种类型的重复,那么

数组

就是你真正想要的。它被定义为一种类型 T 重复 N 次:[T; N]

    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.