问题描述
我正在尝试使用 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());