程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Vec 如何实现 BorrowMut?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Vec 如何实现 BorrowMut??

开发过程中遇到Vec 如何实现 BorrowMut?的问题如何解决?下面主要结合日常开发的经验,给出你关于Vec 如何实现 BorrowMut?的解决方法建议,希望对你解决Vec 如何实现 BorrowMut?有所启发或帮助;

我在标准库文档中运行了以下 example,遇到了一个难题。

我找到了an implementation of the BorrowMut Trait with Vec, 我不明白它是如何工作的。例如,下面的代码表明 No.1 有效,为什么 No.2 无效,泛型 T 有什么作用?

use std::borrow::BorrowMut;

fn check<T: BorrowMut<[i32]>>(mut v: T) {
    assert_eq!(&mut [1,2,3],v.borrow_mut()); // ! no.1 can call,Why?
}

fn main() {
    let v = vec![1,3];
    // v.borrow_mut();  // ! no.2 Can't call,Why?

    check(v);
}

解决方法

rustc 显示的完整错误很好地解释了它。加上重点:

error[E0283]: type Annotations needed
 --> src/main.rs:9:7
  |
9 |     v.borrow_mut();  //! no.2 Can't call,Why?
  |     --^^^^^^^^^^--
  |     | |
  |     | cAnnot infer type for type parameter `Borrowed` declared on the Trait `BorrowMut`
  |     this method call resolves to `&mut Borrowed`
  |     Help: use the fully qualified path for the potential candidate: `<Vec<T> as BorrowMut<[T]>>::borrow_mut(v)`
  |
  = note: cAnnot satisfy `Vec<i32>: BorrowMut<_>`

BorrowMut 可以在一个类型上多次实现。例如,BorrowMut<Foo>BorrowMut<Bar> 都可以为 Vec<i32> 实现;在这些示例中,FooBar 代替了在特征 Borrowed 上声明的“类型参数 BorrowMut”,如 { {3}}(点击“显示声明”)。

在“no.1”中,您指定了 T: BorrowMut<[i32]>;由于没有提到 BorrowMutT 的其他实现,因此可以明确推断出在特征 Borrowed 上声明的“类型参数 BorrowMut”成为[i32]

在“no.2”中,对于您所追求的 BorrowMut 的实现存在歧义:即使 BorrowMut 的其他 Vec<i32> 实现目前不在范围内,它们可能潜伏在编译器不知道的地方(等待通过 use 语句引入范围内);即使现在不存在其他箱子,上游 crate(即 std 库)可能会在未来添加一个 — 然后会破坏您的代码。因此,编译器要求您通过明确通知它您所追求的实现来消除歧义。它通过报告“需要类型注释”来实现这一点,甚至向您展示如何:“为潜在候选人使用完全限定的路径:<Vec<T> as BorrowMut<[T]>>::borrow_mut(v)”。我们可以在这里做到:

<Vec<i32> as BorrowMut<[i32]>>::borrow_mut(v)

然而这行不通有一个单独的原因:Rust 只在使用 . 方法语法调用时执行 its documentation——当这样调用时,你会必须明确传递 &mut v 而不是 v(我已经提交了 deref coercion 关于这个错误建议);并且 仍然你的情况下不起作用,因为 v 没有被声明为可变的。

编译器还得出结论:

For more information about an error,try `rustc --explain E0283`.

这样做会显示 an issue,这也可能有所帮助。

请建议错误消息如何更清楚地解释问题。


实际上,在这种情况下,编译器的建议比解决歧义所需的要冗长。您也可以通过以下任一方式解决它,而无需提及 v 的类型:

<dyn BorrowMut<[i32]>>::borrow_mut(&mut v)
BorrowMut::<[i32]>::borrow_mut(&mut v)

另请注意,在 Vec 的情况下,您可以通过其内在 this extra information方法、索引(通过 as_mut_slice 的实现)、std::ops::Index 或(通过那个)解引用运算符的显式使用。分别:

BorrowMut

确实,由于取消引用,v.as_mut_slice() &mut v[..] v.deref_mut() // DerefMut must be in scope,else qualify as above &mut *v std::ops::DerefMut::deref_mut 到强制转换点的可变切片,例如函数参数和 &mut Vec 绑定——所以你通常可以只使{{1} } 而 Rust 将为您完成剩下的工作。

coerces。

鉴于它们都编译成完全相同的代码,您使用的代码实际上只是一个偏好问题。但是,为了使代码尽可能清晰(并因此可维护),我建议索引方法 let 最清晰简洁地表明您正在对整个向量进行可变切片。

大佬总结

以上是大佬教程为你收集整理的Vec 如何实现 BorrowMut?全部内容,希望文章能够帮你解决Vec 如何实现 BorrowMut?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:如何实现