获取对Vec元素的可变引用或创建新元素并获取该引用

问题描述

我有一个FirebaseAuth mAuth = FirebaseAuth.getInstance(); Signup.setonClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String mEmail = Email.getText().toString(); String mPassword = Password.getText().toString(); String mRepass = Repass.getText().toString(); if (!TextUtils.isEmpty(mEmail) && !TextUtils.isEmpty(mPassword) && !TextUtils.isEmpty(mRepass)){ if (mPassword.equals(mRepass)){ mAuth.createuserWithEmailAndPassword(mEmail,mPassword).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()){ startActivity(new Intent(Signup.this,MainActivity.class)); finish(); }else { Toast.makeText(Signup.this,"Error: " + task.getException().getMessage(),Toast.LENGTH_SHORT).show(); } } }); }else{ Toast.makeText(Signup.this,"Password not match",Toast.LENGTH_SHORT).show(); } }else{ if (TextUtils.isEmpty(mEmail)) { Email.setError("Email-ID is required!"); Email.setHint("Please enter Email-ID"); } if (TextUtils.isEmpty(mPassword)) { Password.setError("Password is required!"); Password.setHint("Please enter Password"); } if (TextUtils.isEmpty(mRepass)) { Repass.setError("Password is required!"); Repass.setHint("Please enter Re-Password"); } } } }); 列表,想要搜索一个元素并获得对该元素的可变引用。如果不存在,则应创建一个新的认元素并将其添加到列表中:

Vec<State>

这导致:

struct State {
    a: usize,}

fn print_states(states: &Vec<State>) {
    for state in states {
        print!("State{{a:{}}} ",state.a);
    }
    println!();
}

fn main() {
    let mut states = vec![State { a: 1 },State { a: 2 },State { a: 3 }];

    print_states(&states);

    let mut state = match states.iter_mut().find(|state| state.a == 2) {
        Some(state) => state,None => {
            let new_state = State { a: 3 };
            states.push(new_state);
            states.last().unwrap()
        }
    };
    state.a = 4;
    drop(state);
    print_states(&states);
}

问题是error[E0594]: cannot assign to `state.a` which is behind a `&` reference --> src/main.rs:25:5 | 17 | let mut state = match states.iter_mut().find(|state| state.a == 2) { | --------- help: consider changing this to be a mutable reference: `&mut State` ... 25 | state.a = 4; | ^^^^^^^^^^^ `state` is a `&` reference,so the data it refers to cannot be written 路径。当使用None而不创建这个新的认元素时,我可以修改找到的元素

要进行这项工作,我需要更改什么?

解决方法

您的问题是state.last().unwrap()行。 .last()上的方法Vec返回&State,这导致编译器将state的类型推断为&State&mut State Some()的情况下可以强制执行)。这就是为什么您不能在第28行更改state的原因。

将行更改为state.last_mut().unwrap()state将是&mut State而不是&State。您的示例将在此之后编译。