You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中Some(v)与Some(&v)的区别?附代码示例

Rust中Some(&number)与Some(number)的区别解析

先明确前提:你代码里的HashMap类型是HashMap<&str, &str>,它的get方法返回Option<&V>——找到对应键时返回Some(&值),这里的“值”本身就是&str,所以实际返回的是Some(&&str)(两层引用);找不到则返回None。

接下来分别拆解两种写法的逻辑:

1. Some(&number) 的作用

在代码块1的match分支中:

match contacts.get(&"Daniel") {
    Some(&number) => println!("Calling Daniel: {}", call(&number)),
    _ => println!("Don't have Daniel's number."),
}

这里的&number是模式匹配的解构引用语法:它会匹配Some内部的&&str,自动“剥掉一层引用”,把最内层的&str绑定给变量number。最终number的类型是&str。

后续调用call(&number)时,虽然传的是&&str,但Rust的自动解引用(Deref Coercion)会自动将其转换为&str,刚好符合call函数的参数要求。

2. Some(number) 的作用

代码块2的match分支中:

match contacts.get("Daniel") {
    Some(number) => println!("Calling Daniel: {}", call(number)),
    _ => println!("Don't have Daniel's number."),
}

这里的number直接绑定了Some内部的&&str(两层引用)。调用call(number)时,同样依靠自动解引用特性,&&str会被转换为&str,满足call的参数要求,因此也能正常运行。

额外补充:你代码里contacts.get(&"Daniel")和contacts.get("Daniel")都能运行,是因为Rust的Borrow trait允许get方法接受与键类型兼容的引用——"Daniel"是&str,&"Daniel"是&&str,二者都能匹配HashMap的键类型&str。


内容的提问来源于stack exchange,提问作者Zach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:05:09