rust - Some(v) 和 Some(&v) 有什么区别?

标签 rust

下面的代码中的代码块1代码块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."),
    }

}

最佳答案

contacts.get("Daniel") 中,参数类型为 &str

contacts.get(&"Daniel") 中,参数类型为 &&str

HashMapget()方法实现如下:

pub fn get<Q: ?Sized>(&self, k: &Q) -> Option<&V>
where
    K: Borrow<Q>,
    Q: Hash + Eq,
{
    self.base.get(k)
}

当您传递 &&str 时,Rust 编译器会自动将 &&str 解引用为 &str。因此,您的两个版本本质上是等效的。

在你的比赛 ARM 中:

  • Some(&number)number的类型是&str
  • Some(number)number的类型是&&str

同样,由于 Rust 的自动取消引用规则,两者本质上是相同的。

请注意,如果您编写了 Some(&&number),则 number 的类型将是 str 并且无法编译消息:

the size for values of type `str` cannot be known at compilation time

但是当您有 &&T 甚至 &&&&&T 时,就如同您有 &T 一样。

关于rust - Some(v) 和 Some(&v) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76277559/

相关文章:

rust - 如何创建具有泛型类型参数的函数向量?

rust - 为什么 Rust 编译器在移动对象后不重用堆栈上的内存?

docker - Docker 镜像上的 pip 找不到 Rust - 即使安装了 Rust

rust - 使用 None 访问 Rust 中的嵌套 HashMap

rust - 安装由 Cargo 构建的用于打包目的的二进制文件的推荐方法是什么?

rust - 可变地获取函数中变量的所有权

rust - Cargo 功能是否可以启用可选依赖项中的功能而不强制激活这些 crate ?

rust - 如何使用迭代器和范围创建阶乘的非递归计算?

rust - 为什么运行 cargo bench 比运行 release build 更快?

rust - 访问子进程的非标准文件描述符