首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“Vec”对std::vec::Vec和&std::vec::Vec都有效?

为什么“Vec”对std::vec::Vec和&std::vec::Vec都有效?
EN

Stack Overflow用户
提问于 2020-06-05 22:55:17
回答 1查看 120关注 0票数 2

我不明白为什么函数get同时与Vec<T>&Vec<T>一起工作。我知道&Vec<T>会自动转换为&[T],所以在某种意义上,问题是为什么它能在Vec<T>&[T]上工作。显然,get&[T]一起工作,所以除了对&[T]的实现之外,它是否单独为Vec<T>实现?看一下这些文档,看起来不像,只有一个get实现:https://doc.rust-lang.org/std/vec/struct.Vec.html#method.get

在下面的代码中,get是对Vec<T>进行操作的。

代码语言:javascript
复制
fn first<T: PartialOrd + Copy>(list: Vec<T>) -> T {
    *list.get(0).unwrap()
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];
    let result = first(number_list);
    println!("The first number is {}", result);
}

在此代码中,它是在&Vec<T> (又名&[T])上操作的:

代码语言:javascript
复制
fn first<T: PartialOrd + Copy>(list: &Vec<T>) -> T {
    *list.get(0).unwrap()
}

fn main() {
    let number_list = vec![34, 50, 25, 100, 65];
    let result = first(&number_list);
    println!("The first number is {}", result);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-05 23:02:04

这是由于自动引用。

来自方法语法的Rust编程语言.

铁锈有一个叫做自动引用和反引用的功能..。使用object.something()调用方法时,Rust会自动添加&&mut*以便对象匹配该方法的签名。换言之,以下情况相同: P1.距离(&p2);(&p1).distance(&p2); 第一个看起来干净多了。这种自动引用行为之所以有效,是因为方法有一个清晰的接收器-- self类型。给定方法的接收方和名称,Rust可以确定该方法是读取(&self)、变异(&mut self)还是消耗(self)。在实践中,锈蚀使方法接收者隐式借用是使所有权符合人体工程学的一个重要部分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62225239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档