问题描述
我有一个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
。您的示例将在此之后编译。