Rust中(&v).func()与&v.func()的区别及(&v)作用解析
Rust中(&v).func()与&v.func()的区别解析
先明确核心差异:Rust里函数调用的优先级高于取引用操作,所以两者的执行顺序完全不同:
(&v).func():先对v取引用得到&v,再调用这个引用的func()方法&v.func():先调用v的func()方法,再对方法的返回值取引用
结合你给出的两段代码具体分析:
第一段代码:(&v).into_iter()
let v = vec!["hello", "viktor"]; let mut iterator = (&v).into_iter(); // Iter<&str>
这里(&v)的作用是把Vec<&str>类型的v转换成&Vec<&str>(不可变引用),然后调用这个引用的into_iter()方法。
Rust为&Vec<T>实现了IntoIterator trait,对应的into_iter()会返回Iter<T>类型的迭代器——这个迭代器不会消耗原Vec,只是遍历原Vec中元素的不可变引用。这里T是&str,迭代器产生的元素实际是&&str(注释里的Iter<&str>是简化写法),原v可以继续被使用。
第二段代码:&v.into_iter()
let mut iterator = &v.into_iter(); // &IntoIter<&str>
这里先执行v.into_iter():Rust为Vec<T>本身实现的IntoIterator trait会返回IntoIter<T>类型的迭代器——这个迭代器会消耗原Vec,把v的所有权转移到迭代器中,原v之后就不能再被使用了。
然后再对这个IntoIter<&str>类型的迭代器取引用,得到&IntoIter<&str>,这是一个指向消耗型迭代器的引用,和第一段的迭代器类型、行为完全不同。
总结(&v)的核心作用
(&v)本质是改变方法调用的接收者类型,让后续调用的into_iter()匹配到为引用类型实现的trait版本,而非为原类型实现的版本,最终得到不同行为、不同类型的返回值。
内容的提问来源于stack exchange,提问作者Victor Orlyk
相关产品推荐
相关产品推荐

