我如何定义类似于 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],
});