引用上的Rust调用方法

引用上的Rust调用方法,rust,borrow-checker,Rust,Borrow Checker,由于对生锈还比较陌生,这是一个我发现了很多资源的问题,但是没有一个能够真正帮助我。 我想做的是引用一个结构并调用它的一个方法 最小化示例: // A rather large struct I would want to live in the heap as to avoid copying it too often. // Emulated by using a huge array for the sake of this example. struct RatedCharacter {

由于对生锈还比较陌生,这是一个我发现了很多资源的问题,但是没有一个能够真正帮助我。 我想做的是引用一个结构并调用它的一个方法

最小化示例:

// A rather large struct I would want to live in the heap as to avoid copying it too often.
// Emulated by using a huge array for the sake of this example.
struct RatedCharacter {
    modifiers : [Option<f64>; 500000]
}

impl RatedCharacter {
    // A method of the large struct that also modifies it.
    fn get_rating(&mut self){
        self.modifiers[0] = Some(4.0);
        println!("TODO: GetRating");
    }
}

// A way to create an instance of the huge struct on the heap
fn create_rated_character(param1: f64, param2: f64) -> Box<RatedCharacter>{
    let modifiers : ModifierList = [None; 500000];
    do_initialisation_based_on_given_parameters();
    let result = RatedCharacter{
        modifiers : modifiers
    };
    return Box::new(result);
}

fn main() {
    let mybox : Box<RatedCharacter> = create_rated_character(2,4);
    let mychar : &RatedCharacter = mybox.as_ref();
    // The following line fails, as the borrow checker does not allow this.
    mychar.get_rating();
}
//我希望将一个相当大的结构放在堆中,以避免过于频繁地复制它。
//在本例中,通过使用大型阵列进行仿真。
结构速率字符{
修饰语:[选项;500000]
}
impl RatedCharacter{
//大型结构的一种方法,也可以对其进行修改。
fn获取_评级(&mut self){
自修饰符[0]=Some(4.0);
println!(“TODO:GetRating”);
}
}
//在堆上创建大型结构实例的一种方法
fn创建分级字符(参数1:f64,参数2:f64)->框{
let修饰符:修饰符列表=[None;500000];
根据给定参数()进行初始化;
let result=RatedCharacter{
修改器:修改器
};
返回框::新建(结果);
}
fn main(){
让mybox:Box=创建额定字符(2,4);
让mychar:&RatedCharacter=mybox.as_ref();
//以下行失败,因为借用检查器不允许这样做。
mychar.get_rating();
}
编译器抱怨
无法将“*mychar”作为可变项借用,因为它位于“&”引用后面


如何让
RatedCharacter
的实例存在于堆中,并且仍然调用其方法

由于您的
get_rating
也意外地修改了实例,因此您需要使其可变。首先是
,然后引用也应该是可变的

    let mut mybox : Box<RatedCharacter> = create_rated_character(2 as f64,4 as f64);
    let mychar : &mut RatedCharacter = mybox.as_mut();

    mychar.get_rating();
let mut mybox:Box=创建分级字符(2为f64,4为f64);
让mychar:&mut RatedCharacter=mybox.as_mut();
mychar.get_rating();