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
相关产品推荐
相关产品推荐

