下面代码中的code block 1
和code block 2
都可以工作,但我不知道为什么。Some(&number)
和Some(number)
有什么区别?
use std::collections::HashMap;
fn call(number: &str) -> &str {
match number {
"798-1364" => "We're sorry, please hang up and try again.",
"645-7689" => "Hello, what can I get for you today?",
_ => "Hi! Who is this again?"
}
}
fn main() {
let mut contacts = HashMap::new();
contacts.insert("Daniel", "798-1364");
//====== code block 1
match contacts.get(&"Daniel") {
Some(&number) => println!("Calling Daniel: {}", call(&number)),
_ => println!("Don't have Daniel's number."),
}
//====== code block 2, without '&'
match contacts.get("Daniel") {
Some(number) => println!("Calling Daniel: {}", call(number)),
_ => println!("Don't have Daniel's number."),
}
}
1条答案
按热度按时间dba5bblo1#
在
contacts.get("Daniel")
中,参数的类型是&str
。在
contacts.get(&"Daniel")
中,参数的类型是&&str
。HashMap
的get()方法实现如下:当您传递
&&str
时,Rust编译器会自动将&&str
解引用为&str
。因此,您的两个版本在本质上是等同的。在您的
match
* 手臂 *:Some(&number)
number
的类型是&str
,Some(number)
number
的类型是&&str
。同样,由于Rust的自动解引用规则,两者本质上是相同的。
请注意,如果您编写了
Some(&&number)
,number
的类型将是str
,并且不会编译为以下消息:但是当你有
&&T
甚至&&&&&T
时,就像你有&T
一样。