不可变变量, 为什么可以作为可变引用传入方法?

2023-03-25 0 4,090

这里有人能帮我解释一下这个问题吗?谢谢了

let ptr = story.as_mut_ptr();
as_mut_ptr的方法签名是:

    pub fn as_mut_ptr(&mut self) -> *mut u8 {
        self as *mut str as *mut u8
    }

story明明是个不可变变量, 为什么可以作为可变引用传入方法?

sorry, 我搞错了!少看了一句
let mut story = mem::ManuallyDrop::new(story);

下面是完整代码

use std::mem;

fn main() {
    let story = String::from("Rust By Practice");

    // Prevent automatically dropping the String's data
    let mut story = mem::ManuallyDrop::new(story);

    let ptr = story.as_mut_ptr();
    let len = story.len();
    let capacity = story.capacity();

    // story has nineteen bytes
    assert_eq!(16, len);

    // We can re-build a String out of ptr, len, and capacity. This is all
    // unsafe because we are responsible for making sure the components are
    // valid:
    let s = unsafe { String::from_raw_parts(ptr, len, capacity) };

    assert_eq!(*story, s);

    println!("Success!")
}


回答:
error[E0596]: cannot borrow `story` as mutable, as it is not declared as mutable
 --> src/main.rs:4:15
  |
3 |     let story = String::from("Rust By Practice");
  |         ----- help: consider changing this to be mutable: `mut story`
4 |     let ptr = story.as_mut_ptr();
  |               ^^^^^^^^^^^^^^^^^^ cannot borrow as mutable
经过 let mut story = mem::ManuallyDrop::new(story); ,story 已经不是一个 String ,而是一个 stuct std::mem::ManuallyDrop<String>。它的 new 是这样的:

pub const fn new(value: T) -> ManuallyDrop<T>
原来的 immutable 的 String ,被 move 进了 mut ManuallyDrop<String> 。

而 MuauallyDrop 实现了 trait DerefMut ,于是会发生 Deref Coercion:

If T implements DerefMut<Target = U>, and x is a value of type T, then:

In mutable contexts, *x (where T is neither a reference nor a raw pointer) is equivalent to *DerefMut::deref_mut(&mut x).
Values of type &mut T are coerced to values of type &mut U
T implicitly implements all the (mutable) methods of the type U.
(这里,T 是 ManuallyDrop<String> ,U 是 String)

于是你可以在 mut ManuallyDrop<String> 上调用所有 String 的 mutable methods。
收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

1. 有软官网所有资源来源于开发团队,加入会员即可下载使用!如有问题请联系右下角在线客服!
2. 有软官方保障所有软件都通过人工亲测,为每位会员用户提供安全可靠的应用软件、游戏资源下载及程序开发服务。
3. 有软团队针对会员诉求,历经多年拥有现今开发成果, 每款应用程序上线前都经过人工测试无误后提供安装使用,只为会员提供安全原创的应用。
4. PC/移动端应用下载后如遇安装使用问题请联系右下角在线客服或提交工单,一对一指导解决疑难。

有软官网_用软件,找有软 技术分享 不可变变量, 为什么可以作为可变引用传入方法? https://www.jiaruvip.com/986.html

有软应用商店是经过官方安全认证,保障正版软件平台

相关资源

官方客服团队

为您解决烦忧 - 24小时在线 专业服务