string - 运行时构建 : String not found in this scope

标签 string rust substrate rust-no-std

基板开发人员可能会遇到的一个常见问题:开发自定义托盘以将映射存储到具有常见类型的存储中,例如 String .举个例子:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}
在构建运行时,每 String 都会出现此错误:
     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope
为什么是 Strings不包括在范围内?及其他 std rust 的种类?

最佳答案

这里的错误与no_std无关,所以你可能只需要导入 String type 以获取在运行时中使用字符串的真正错误。
你会发现真正的问题是 String Parity SCALE Codec 无法编码,这显然是运行时中任何存储项(或大多数您想要使用的任何类型)的要求。
所以问题是“为什么SCALE不编码String”?
这是自己选择的。一般来说,String是令人惊讶的复杂类型。 Rust 书花 a whole section谈论类型的复杂性。
因此,它很容易成为人们使用的运行时环境中的一把枪String s 不正确。
此外,存储 String 通常是不好的做法。 s 在运行时存储中。我认为我们可以很容易地同意,最小化运行时中的存储使用量是一种最佳实践,因此您应该只将需要能够在运行时中获得共识和状态转换的存储项放入存储中。大多数情况下,String data 将用于元数据,这种用法不是最佳实践。
如果您更仔细地查看 Substrate,您会发现我们不止一次违反了这一最佳实践,但这是我们明确做出的决定,拥有能够正确评估成本/ yield 的信息。
所有这些结合在一起就是为什么 String s 不被视为运行时中的第一类对象。相反,我们要求用户将字符串编码为字节,然后改为使用该字节数组。

关于string - 运行时构建 : String not found in this scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65348505/

相关文章:

java - String 的 split 函数没有

实现迭代器时出现 Rust 类型错误

rust - 递归类型和数组

substrate - 如何在 Substrate 中更新我的 token 名称?

java - 从字符串中删除特殊字符

string - Powershell字符串未正确串联

rust - 我无法构建奇偶校验基板运行时,因为找不到 wasm-gc 命令

rust - 如何消除同名特征之间的歧义?

Ruby:删除字符串开头的空白字符

git - 我如何压缩 zlib 数据并找出有多少输入字节?