微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在迭代器 reduce 中返回对临时值错误的引用

如何解决无法在迭代器 reduce 中返回对临时值错误的引用

我正在尝试使用 reducer 计算元素总数。

// map: Map<(i8,i8),u8>
// row: Vec<u8>

row.push(
    *map
    .values()
    .reduce(|acc,curr| &(acc + curr))
    .unwrap_or(&0u8)
);

我收到以下编译错误

error[E0515]: cannot return reference to temporary value
   --> src/main.rs:173:46
    |
173 |                         .reduce(|acc,curr| &(acc + curr))
    |                                              ^-------------
    |                                              ||
    |                                              |temporary value created here
    |                                              returns a reference to data owned by the current function

此处,reduce 期待 &u8 但它不能更改为引用,因为它是一个临时值。如何解决这个问题?

解决方法

一个通用的解决方案是将元素从引用映射到具体值,这在这里是可能且便宜的:

row.push(
    map
        .values()
        .copied() // shortcut for .map(|&v| v)
        .reduce(|acc,curr| (acc + curr))
        .unwrap_or(0)
);

但更简洁的解决方案是避免使用 reduce,它会根据它接收的元素类型构建结果,而是使用 fold

row.push(
    map
        .values()
        .fold(0,|acc,&curr| (acc + curr))
);

这还可以让您通过在地图为空时使用初始值来避免 unwrap_or

直到现在,我一直假设您的计算比您展示的计算更复杂。如果不是这种情况,那么只需使用 sum:

row.push(map.values().sum());

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。