在下面的Python中,几个文件被读取,它们的内容被用作字典的值(以文件名为键),我们如何将其翻译为Rust?

countries = {region: open("{}.txt".format(region)).read() for region in ["canada", "usa", "mexico"]}

我的try 如下图所示,但我想知道是否有可能实现一个单行的惯用解决方案.

use std::{
    fs::File,
    io::{prelude::*, BufReader},
    path::Path,
    collections::HashMap,
};

macro_rules! map(
    { $($key:expr => $value:expr),+ } => {
        {
            let mut m = HashMap::new();
            $(
                m.insert($key, $value);
            )+
            m
        }
     };
);

fn lines_from_file<P>(filename: P) -> Vec<String>
where
    P: AsRef<Path>,
{
    let file = File::open(filename).expect("no such file");
    let buf = BufReader::new(file);
    buf.lines()
        .map(|l| l.expect("Could not parse line"))
        .collect()
}

fn main() {
    let _countries = map!{ "canada" => lines_from_file("canada.txt"),
                           "usa"    => lines_from_file("usa.txt"),
                           "mexico" => lines_from_file("mexico.txt") };
}

推荐答案

Rust的迭代器有map/filter/collect方法,这些方法足以完成Python的理解所能完成的任何事情.可以在成对迭代器上创建HashMapcollect,但collect可以返回各种类型的集合,因此可能需要指定所需的类型.

例如

use std::collections::HashMap;

fn main() {
    println!(
        "{:?}",
        (1..5).map(|i| (i + i, i * i)).collect::<HashMap<_, _>>()
    );
}

大致相当于Python

print({i+i: i*i for i in range(1, 5)})

但从字面上看,它实际上更接近

from builtins import dict

def main():
    print("{!r}".format(dict(map(lambda i: (i+i, i*i), range(1, 5)))))

if __name__ == "__main__":
    main()

你永远不会那样说.

Rust相关问答推荐

为什么在Rust struct 中只允许最后一个字段具有动态大小的类型

空字符串转换为Box字符串时是否分配?<>

为什么我可以跟踪以前borrow 过的变量?房主在哪里?

使用铁 rust S还原对多个数组执行顺序kronecker积

作为1字节位掩码的布尔值 struct

允许 rust 迹 struct 条目具有多种类型

考虑到Rust不允许多个可变引用,类似PyTorch的自动区分如何在Rust中工作?

为什么HashMap::get和HashMap::entry使用不同类型的密钥?

这是什么:`impl Trait for T {}`?

为什么是&mut发送?线程如何在安全的 Rust 中捕获 &mut?

Rust 1.70 中未找到 Trait 实现

中文优化标题:跳出特定循环并返回一个值

如何将 &[T] 或 Vec<T> 转换为 Arc<Mutex<[T]>>?

pyO3 和 Panics

在 Rust 中如何将值推送到枚举 struct 内的 vec?

Rust HRTB 是相同的,但编译器说一种类型比另一种更通用

通用函数中的生命周期扣除和borrow (通用测试需要)

制作嵌套迭代器的迭代器

如何在没有 `make_contiguous()` 的情况下对 VecDeque 进行排序或反转?

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?