flat_map 的神秘行为

Posted

技术标签:

【中文标题】flat_map 的神秘行为【英文标题】:Mysterious behavior from flat_map 【发布时间】:2022-01-13 06:56:28 【问题描述】:

结果

println!(":?", (1..4).flat_map(|x| x*2..x*3).collect::<Vec<usize>>())

[2, 4, 5, 6, 7, 8],而我希望是[2,3,4,5,6,6,7,8,9,8,9,10,11,12]

为什么我会得到这个结果?

【问题讨论】:

【参考方案1】:

这与flat_map 无关,但与std::ops::Range 无关,std::ops::Range 被定义为“包含在下面,只在上面”。也就是说,在1..4-范围内,最大值将是 3,而不是 4。您要查找的是 std::ops::RangeInclusive,您必须在代码中使用两次:

fn main() 
    // Notice that
    assert!(!(1..4).contains(&4));
    // but
    assert!((1..=4).contains(&4));

    assert_eq!(
        (1..=4).flat_map(|x| x * 2..=x * 3).collect::<Vec<usize>>(),
        vec![2, 3, 4, 5, 6, 6, 7, 8, 9, 8, 9, 10, 11, 12]
    )

【讨论】:

以上是关于flat_map 的神秘行为的主要内容,如果未能解决你的问题,请参考以下文章

神秘的角度行为 - 有些表单在输入时提交,有些则没有

分段错误和神秘的循环行为

神秘的核心数据行为在第二次获取时检索空对象

Unity3D Behavior Designer 行为树3 不能被Disable的BehaviorManager及其神秘的TaskExecutionType

drawRect中不同颜色的不同行为:[重复]

在DataGrid的WinRT端口中,神秘的“没有足够的配额可用于处理此命令”