作为一名熟悉指针和取消引用的C程序员,我正在学习Rust教程,并且遇到了一些我不理解的事情.

fn main() {
    let vector = vec![10, 20, 30, 40];
    for entry in &vector {
        if *entry == 30 { // I have to use a star (dereference) here...
            println!("thirty");
        } else {
            println!("{}", entry);
        }
        match entry { // ...but why do I not need a star here?
            30 => println!("thirty"),
            _ => println!("{}", entry), // or here?
        }
    }
}

推荐答案

在第一种情况下,您的if语句正在与一个值进行比较,因此您必须带入值,也就是取消对它的引用,以便正确地比较values. 此外,向量上的循环意味着调用.into_iter(),在给定上下文的情况下,它为您提供了对entry中当前值的引用&T.

在第二次匹配时,Rust编译器将应用自动取消引用,因此编译器已经知道您不想匹配指针,而是匹配值.正如其他人指出的那样,Match语句包含一些人体工程学,以使代码更具可读性.

Rust相关问答推荐

如何在不安全的代码中初始化枚举 struct

在UdpSocket上使用sendto时的隐式套接字绑定

默认特征实现中的生命周期问题

你是如何在铁 rust 一侧的金牛座获得应用程序版本的?

在本例中,为什么我不能一次多次borrow 可变变量?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

字段类型为Boxed的 struct 的生存期必须超过static

rust 蚀生命周期 不匹配-不一定超过此处定义的生命周期

Rust将String上的迭代器转换为&;[&;str]

Rust 中什么时候可以返回函数生成的字符串切片&str?

如何轮询 Pin>?

borrow 是由于对 `std::sync::Mutex>` 的解引用强制而发生的

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

Boxing 如何将数据从堆栈移动到堆?

如何正确使用git2::Remote::push?

为什么我们有两种方法来包含 serde_derive?

如何判断服务器是否正确接收数据

类型判断模式匹配panic

仅当满足外部条件时如何添加到 actix web 的路由

在 Rust 中组合特征的不同方法是否等效?