为何Rust中Option为None时,and方法的入参表达式仍会执行?
问题解答
你忽略了Rust函数参数的立即求值特性——所有函数(包括Option::and)在被调用前,传入的参数都会先被完整计算,不管函数内部会不会用到这个参数。
文档里的描述“如果选项是None则返回None,否则返回optb”,指的是函数内部的逻辑:当原Option不为None时,返回你传入的optb值,但optb本身在调用and函数之前就已经被求值完毕了,不是等到函数判断后才去计算它。
看你的代码:
let n: Option<i32> = None; let m = n.and(Some(n.unwrap()));
在执行n.and(...)之前,程序会先计算括号里的Some(n.unwrap()),这时候n是None,unwrap()直接触发panic,根本没机会进入and函数的逻辑里执行判断。
如果想要实现“只有原Option不为None时才计算后续表达式”的效果,应该用Option::and_then方法,它接受一个闭包,闭包只会在原Option为Some时才被执行:
let n: Option<i32> = None; let m = n.and_then(|val| Some(val)); // 不会panic,因为闭包没被调用
简单总结:
and接受现成的Option值,参数提前求值and_then接受返回Option的闭包,闭包惰性求值,仅在需要时执行
内容的提问来源于stack exchange,提问作者Horowitzathome
相关产品推荐
相关产品推荐

