假设有
let a = Some(1);
let b = Some(2);
let f = |(x, y)| x + y;
不知道标准库里有没有一个简便的方法实现如下功能:
let c = match a {
None => b,
Some(a_value) => match b {
None => Some(a_value),
Some(b_value) => Some(f(a_value, b_value)),
}
};
1
共 17 条评论, 1 页
评论区
写评论这个是否可行?
a.map(|a| b.map_or(a, |b| a + b)).or(b);
感觉可读性很差感觉好不到哪里去
--
👇
xiaopengli89: a 或 b 为 None 时结果不是预期的。
--
👇
Dengjianping: ```rust let c = a.zip(b).map(|(x, y)| x + y);
a 或 b 为 None 时结果不是预期的。
--
👇
Dengjianping: ```rust let c = a.zip(b).map(|(x, y)| x + y);
修正下,返回值是Option
Some(1)
Option -> Iter -> Chain
3
1
这么写可能更加符合你的需求
--
👇
kaoet: 没错,对于整数可以这样写。但实际情况是,我拥有的是
Option<Strange>
。这个Strange
类型是可以做加法的,但没有加法单位元(也就是0)。所以.unwrap_or(0)
这种方式不太好使……--
👇
cnwzhjs: sorry, 没仔细看 这个需求似乎比较奇怪,可能只能这么写:
使用
unwrap_or_default()
--
👇
kaoet: 没错,对于整数可以这样写。但实际情况是,我拥有的是
Option<Strange>
。这个Strange
类型是可以做加法的,但没有加法单位元(也就是0)。所以.unwrap_or(0)
这种方式不太好使……--
👇
cnwzhjs: sorry, 没仔细看 这个需求似乎比较奇怪,可能只能这么写:
没错,对于整数可以这样写。但实际情况是,我拥有的是
Option<Strange>
。这个Strange
类型是可以做加法的,但没有加法单位元(也就是0)。所以.unwrap_or(0)
这种方式不太好使……--
👇
cnwzhjs: sorry, 没仔细看 这个需求似乎比较奇怪,可能只能这么写:
sorry, 没仔细看 这个需求似乎比较奇怪,可能只能这么写:
--
👇
kaoet: 代码不等价。 我的例子里,
merge(Some(1), None) = Some(1)
,你的代码中merge(Some(1), None) = None
.--
👇
cnwzhjs: 也可以用lambda:
--
👇
cnwzhjs:
代码不等价。 我的例子里,
merge(Some(1), None) = Some(1)
,你的代码中merge(Some(1), None) = None
.--
👇
cnwzhjs: 也可以用lambda:
--
👇
cnwzhjs:
还有一个nightly的api: std::option::Option::zip_with
--
👇
cnwzhjs: 也可以用lambda:
--
👇
cnwzhjs: ```rust fn main() { let a = Some(1); let b = Some(2); let c = match (a, b) { (Some(a), Some(b)) => Some(a+b), _ => None }; println!("hello, {:?}", c); }
也可以用lambda:
--
👇
cnwzhjs: ```rust fn main() { let a = Some(1); let b = Some(2); let c = match (a, b) { (Some(a), Some(b)) => Some(a+b), _ => None }; println!("hello, {:?}", c); }