【问题标题】:Why does `get` work on both std::vec::Vec and &std::vec::Vec? [duplicate]为什么 `get` 对 std::vec::Vec 和 &std::vec::Vec 都有效? [复制]
【发布时间】:2020-09-25 05:52:07
【问题描述】:

我很困惑为什么函数 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>

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);
}

在这段代码中,它作用于&amp;Vec&lt;T&gt;(又名&amp;[T]):

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);
}

【问题讨论】:

    标签: rust reference


    【解决方案1】:

    这是由于自动引用。

    来自 Rust 编程语言中的 Method Syntax...

    Rust 有一个称为自动引用和解除引用的功能 [...] 当您使用 object.something() 调用方法时,Rust 会自动添加 &amp;&amp;mut*所以对象匹配方法的签名。换句话说,以下是相同的:

    p1.distance(&p2);
    (&p1).distance(&p2);
    

    第一个看起来更干净。这种自动引用行为之所以有效,是因为方法有一个明确的接收者——self 的类型。给定方法的接收者和名称,Rust 可以确定该方法是读取(&amp;self)、变异(&amp;mut self)还是消费(self)。 Rust 为方法接收者隐式借用的事实是使所有权在实践中符合人体工程学的重要部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多