基板开发人员可能会遇到的一个常见问题:开发自定义托盘以将映射存储到具有常见类型的存储中,例如 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/