【问题标题】:Does Rust have an equivalent to Python's list comprehension syntax?Rust 是否具有与 Python 的列表理解语法等价的功能?
【发布时间】:2017-12-30 04:19:15
【问题描述】:

Python 列表推导真的很简单:

>>> l = [x for x in range(1, 10) if x % 2 == 0]
>>> [2, 4, 6, 8] 

Rust 是否有类似的等价语法:

let vector = vec![x for x in (1..10) if x % 2 == 0]
// [2, 4, 6, 8]

【问题讨论】:

    标签: syntax rust list-comprehension iterable


    【解决方案1】:

    你可以只使用迭代器:

    fn main() {
        let v1 = (0u32..9).filter(|x| x % 2 == 0).map(|x| x.pow(2)).collect::<Vec<_>>();
        let v2 = (1..10).filter(|x| x % 2 == 0).collect::<Vec<u32>>();
    
        println!("{:?}", v1); // [0, 4, 16, 36, 64]
        println!("{:?}", v2); // [2, 4, 6, 8]
    }
    

    【讨论】:

    • 你了解复杂性吗?应用过滤器然后映射力是否会重复两次,从而使计算时间加倍?
    • @Darkaird 没有。迭代器是惰性的,每个元素只处理一次。
    【解决方案2】:

    cute 是 Rust 中 Python 式列表和字典 (HashMap) 推导的宏。

    #[macro_use(c)]
    extern crate cute;
    
    let vector = c![x, for x in 1..10, if x % 2 == 0];
    

    【讨论】:

    • 我已经看过这个并发现它非常有趣,但我想要的是更多的内置函数/语法,如 @ljedrz 回答。
    • @Darkaird rust 有一个相当精简的标准库,所以如果没有额外的板条箱,你可能不会走得太远。
    猜你喜欢
    • 2019-05-10
    • 2010-11-19
    • 2012-09-19
    • 2011-11-27
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多