为什么Rust无法在类型构造函数中将可变引用强制转换为不可变引用?

普比克

可以强迫&mut T进入,&T但是如果在类型构造函数中发生类型不匹配,则无法使用。

操场

use ndarray::*; // 0.13.0

fn print(a: &ArrayView1<i32>) {
    println!("{:?}", a);
}

pub fn test() {
    let mut x = array![1i32, 2, 3];
    print(&x.view_mut());
}

对于上面的代码,我得到以下错误:

  |
9 |     print(&x.view_mut());
  |           ^^^^^^^^^^^^^ types differ in mutability
  |
  = note: expected reference `&ndarray::ArrayBase<ndarray::ViewRepr<&i32>, ndarray::dimension::dim::Dim<[usize; 1]>>`
             found reference `&ndarray::ArrayBase<ndarray::ViewRepr<&mut i32>, ndarray::dimension::dim::Dim<[usize; 1]>>`

可以强制&mut i32使用&i32,为什么不将其应用于这种情况?您能否提供一些示例,说明如何可能适得其反?

msrd0

考虑对此空字符串进行检查,该空字符串依赖于函数content运行时保持不变is_empty(仅出于说明目的,请勿在生产代码中使用此字符串):

struct Container<T> {
    content: T
}

impl<T> Container<T> {
    fn new(content: T) -> Self
    {
        Self { content }
    }
}

impl<'a> Container<&'a String> {
    fn is_empty(&self, s: &str) -> bool
    {
        let str = format!("{}{}", self.content, s);
        &str == s
    }
}

fn main() {
    let mut foo : String = "foo".to_owned();
    let container : Container<&mut String> = Container::new(&mut foo);

    std::thread::spawn(|| {
        container.content.replace_range(1..2, "");
    });

    println!("an empty str is actually empty: {}", container.is_empty(""))
}

(操场)

由于&mut String不强制转换为,因此该代码无法编译&String但是,如果确实如此,则新创建的线程可能会contentformat!调用之后但在is_empty函数中的相等比较之前更改,从而使容器内容是不可变的假设无效,这是空检查所必需的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当我们永远不能同时拥有可变引用时,我们如何将可变引用强制转换为不可变引用?

在Scala中将可变集合转换为不可变集合

在 Swift 中将可变结构转换为不可变结构

为什么存在对 rust 中复制类型的不可变引用?

如何在Rust中解释对可变类型的不可变引用?

将可变数组引用传递到也需要可变数组引用的函数中时,为什么不声明&mut?

为什么Rust阻止了多个可变引用?

如何使Rust可变引用不可变?

Rust 将可变枚举引用与向量匹配

当Rust中的函数需要可变引用时,为什么不变引用可以匹配?

使用const泛型将可变指针数组转换为可变引用

为什么 Rust 不可变引用可以调用 &mut self 方法?

当返回对范围外的值的可变引用的不可变引用时,为什么在范围结束时丢弃了可变引用?

如何避免在Rust中为可变和不可变引用编写重复的访问器函数?

如何更新对不可复制类型的可变引用?

无法从 initializer_list 转换为我的类型,它具有模板可变参数构造函数

将可变引用移出可变对象

多个不可变引用

JAVA中将类型强制转换为“ null”到任何引用类型的用途是什么?

在Python字典中将可变项(例如列表)引用为值-最佳做法是什么?

Rust:在递归函数中使用可变引用

为什么可以从函数返回对文字的可变引用?

在将可变引用设置为引用新创建的对象之后,线程是否仍会感觉到构造函数的效果?

根据函数签名将可变参数模板中的类型转发为值/引用

Rust无法分配Option内部可变引用

将可变参数类型列表转换为对的元组

为什么将表达式强制转换为右值,对函数的引用是左值?

对不可变数据的可变引用

如何可变引用不可变值