< 返回版块

sstudioer 发表于 2021-03-11 15:24

BorrowMut只要点错某个函数, clion 自动use;

struct S{
    age: int,
}

fn main() {
    let mut a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b = (a.borrow_mut());  // 其他可用的method 都测试了, 都无法修改age;
    b.age = 10;  
}

primer例子也无法重现:

use std::collections::HashMap;
use std::cell::RefCell;
use std::rc::Rc;

fn main() {
    let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
    shared_map.borrow_mut().insert("africa", 92388);
    shared_map.borrow_mut().insert("kyoto", 11837);
    shared_map.borrow_mut().insert("piccadilly", 11826);
    shared_map.borrow_mut().insert("marbles", 38);
}```

评论区

写评论
yuchunzhou 2021-03-11 17:46
use std::cell::RefCell;
use std::rc::Rc;

#[derive(Debug)]
struct S{
    age: i8,
}

fn main() {
    let a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b = a.borrow_mut();
    b.age = 10;
    drop(b);
    println!("{:?}", a.borrow());
}
// S { age: 10 }
yuchunzhou 2021-03-11 17:43
use std::cell::RefCell;
use std::rc::Rc;

#[derive(Debug)]
struct S{
    age: i8,
}

fn main() {
    let a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b = a.borrow_mut();
    b.age = 10;
    println!("{:?}", b);
}
// S { age: 10 }
yuchunzhou 2021-03-11 17:39
use std::collections::HashMap;
use std::cell::RefCell;
use std::rc::Rc;

fn main() {
    let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
    shared_map.borrow_mut().insert("africa", 92388);
    shared_map.borrow_mut().insert("kyoto", 11837);
    shared_map.borrow_mut().insert("piccadilly", 11826);
    shared_map.borrow_mut().insert("marbles", 38);
    
    for (k, v) in shared_map.borrow().iter() {
        println!("{:?}:{:?}", k, v);
    }
}
// "africa":92388
// "kyoto":11837
// "marbles":38
// "piccadilly":11826
eweca-d 2021-03-11 17:12

类型推断的问题吧。

你引入了'borrow_mut'所以导致'let mut b = a.borrow_mut();',这句话被推断为b是a变量的一个可变借用,等同于'let mut b = &mut a',所以会导致'no field age on type &mut Rc<RefCell<S>>'。编译器错误提示非常简洁明显的提示你错误的问题了。如果不引入这个trait的话,Rc本身不包含borrow_mut这个方法,显然会自动解引用到RefCell,然后调用borrow_mut,结果就是正确的。

这些基本上看编译器错误提示就知道怎么改了。

w 2021-03-11 16:56

原来我也是因为引用了BorrowMut导致通过不了编译。

搜了下有人提过这个问题

eweca-d 2021-03-11 16:56

1.50,很正常,能跑通,结果也没问题

use std::rc::Rc;
use std::cell::RefCell;

struct S{
    age: i32,
}

fn main() {
    let mut a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b = a.borrow_mut();
    b.age = 10;  
    println!("{:?}", b.age);
}
作者 sstudioer 2021-03-11 16:51

原因竟然这么诡异! 这是我测试代码怎么测试都不通过; 因为测试没删use, 话说这use这么强大吗? 影响代码编译?

#![allow(dead_code,unused)]
#![feature(new_uninit)]
#![feature(nll)]
#![feature(cell_leak)]
use std::cell::Cell;
use std::borrow::{BorrowMut};  // 忘记删除use?!
use std::ops::DerefMut;

use std::rc::Rc;
use std::cell::RefCell;
use std::collections::HashMap;
struct S{
	age: i32,
}

fn main() {
	let a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
	let mut b = a.borrow_mut();
	b.age = 20;
	println!("{:?}", b.age);

}

w 2021-03-11 16:49

这个例子我本机也跑不通,看了下插件的类型推断和与其是不一致的(下面的类型是我把插件推断的类型复制上去的,不是指定的)。

    let a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b:&mut Rc<Rc<RefCell<S>>> = a.borrow_mut();

错误提示

error[E0609]: no field `age` on type `&mut Rc<RefCell<S>>`
  --> src/main_rc.rs:30:7
   |
30 |     b.age = 20;
   |       ^^^ unknown field

看了下本机的版本和页面版本也对的上

C:\Users\...>rustc --version
rustc 1.50.0 (cb75ad5db 2021-02-10)

改成这样才行

struct S{
    age: i32,
}
fn main() {
    use std::cell::RefCell;
    use std::collections::HashMap;


    let a: Rc<RefCell<S>> = Rc::new(RefCell::new(S { age: 15 }));
    let mut b = (*a).borrow_mut();
    b.age = 20;
    println!("{:?}", b.age);

    let shared_map: Rc<RefCell<_>> = Rc::new(RefCell::new(HashMap::new()));
    (*shared_map).borrow_mut().insert("africa", 92388);
    (*shared_map).borrow_mut().insert("kyoto", 11837);
    (*shared_map).borrow_mut().insert("piccadilly", 11826);
    (*shared_map).borrow_mut().insert("marbles", 38);

    println!("{:?}", shared_map);
}

--
👇
LJason77: 真就看标题知作者呗。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d345f297df1a6f44f7a27a2b87bbd5e

没看懂哪里有问题?

LJason77 2021-03-11 16:32

真就看标题知作者呗。

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=1d345f297df1a6f44f7a27a2b87bbd5e

没看懂哪里有问题?

1 共 9 条评论, 1 页