我如何定义类似于 Python 的 Rust 结构文字?
How can I define Rust structure literals similar to Python's?
我想用文字初始化一个 Rust 变量。
Shepmaster guesses Rust 没有映射文字,因为:
the fact that there are multiple data structures that act maplike
(such as both BTreeMap and HashMap) would make it hard to pick one.
但是 Rust 说 "you should probably just use Vec or HashMap",这意味着如果它们对于大多数用途来说足够好,那么在从文字值初始化时使用它们通常应该可以正常工作。
示例地图初始化很笨拙,但打印它会产生更简洁的表示:
{"Mars": 1.5, "Mercury": 0.4, "Earth": 1.0, "Venus": 0.7}
.
fn main() {
use std::collections::HashMap;
let solar_distance = HashMap::from([
("Mercury", 0.4),
("Venus", 0.7),
("Earth", 1.0),
("Mars", 1.5),
]);
println!("{:?}", solar_distance)
}
In Python x = {"Mars": 1.5, "Mercury": 0.4, "Earth": 1.0, "Venus": 0.7}
会初始化一个字典变量。如果 Rust 的未来版本能够接受嵌套列表和映射文字来初始化相应的默认 Vec 和 HashMap 结构,那就太好了。
Rust 功能路线图上是否有简洁的嵌套文字格式?
第二好的解决方案是从 JSON 字符串初始化结构(可能使用一些语法糖来避免引号转义地狱):
fn main() {
use std::collections::HashMap;
let x = String::from("{'Venus': 0.7, 'Mars': 1.5, 'Mercury': 0.4, 'Earth': 1.0}");
println!("{:?}", x);
let solar_distance = HashMap::from(x);
println!("{:?}", solar_distance);
}
但这失败了:
|
7 | let solar_distance = HashMap::from(x);
| ^^^^^^^^^^^^^ the trait `From<String>` is not implemented for `HashMap<_, _, _>`
有人写过从 JSON 字符串初始化嵌套 vec/hash 变量的方法吗?
如果你想能够简洁地初始化一个HashMap
(类似于vec![]
),看看https://crates.io/crates/hmap。它基本上完全符合您的描述。
如果您想使用 serde_json
,您可以使用该库提供的 json!()
宏:
let x = json!({
"foo": "bar",
"baz": [1, 2, 3],
});
我想用文字初始化一个 Rust 变量。
Shepmaster guesses Rust 没有映射文字,因为:
the fact that there are multiple data structures that act maplike (such as both BTreeMap and HashMap) would make it hard to pick one.
但是 Rust 说 "you should probably just use Vec or HashMap",这意味着如果它们对于大多数用途来说足够好,那么在从文字值初始化时使用它们通常应该可以正常工作。
示例地图初始化很笨拙,但打印它会产生更简洁的表示:
{"Mars": 1.5, "Mercury": 0.4, "Earth": 1.0, "Venus": 0.7}
.
fn main() {
use std::collections::HashMap;
let solar_distance = HashMap::from([
("Mercury", 0.4),
("Venus", 0.7),
("Earth", 1.0),
("Mars", 1.5),
]);
println!("{:?}", solar_distance)
}
In Python x = {"Mars": 1.5, "Mercury": 0.4, "Earth": 1.0, "Venus": 0.7}
会初始化一个字典变量。如果 Rust 的未来版本能够接受嵌套列表和映射文字来初始化相应的默认 Vec 和 HashMap 结构,那就太好了。
Rust 功能路线图上是否有简洁的嵌套文字格式?
第二好的解决方案是从 JSON 字符串初始化结构(可能使用一些语法糖来避免引号转义地狱):
fn main() {
use std::collections::HashMap;
let x = String::from("{'Venus': 0.7, 'Mars': 1.5, 'Mercury': 0.4, 'Earth': 1.0}");
println!("{:?}", x);
let solar_distance = HashMap::from(x);
println!("{:?}", solar_distance);
}
但这失败了:
|
7 | let solar_distance = HashMap::from(x);
| ^^^^^^^^^^^^^ the trait `From<String>` is not implemented for `HashMap<_, _, _>`
有人写过从 JSON 字符串初始化嵌套 vec/hash 变量的方法吗?
如果你想能够简洁地初始化一个HashMap
(类似于vec![]
),看看https://crates.io/crates/hmap。它基本上完全符合您的描述。
如果您想使用 serde_json
,您可以使用该库提供的 json!()
宏:
let x = json!({
"foo": "bar",
"baz": [1, 2, 3],
});