Почему при использовании Rust передача изменяемой структуры в функцию приводит к неизменным полям?
Я изучаю Rust, используя 0.8 на Win8-64. У меня есть тестовая программа, в которой я работаю, где функция, которая обрабатывает ввод параметров, возвращает структуру, содержащую эти параметры. Это работало хорошо. Затем я изменил программу, чтобы передать & struct функции, и теперь я получаю ошибку компилятора, которую я пытаюсь присвоить неизменному полю.
Как я должен передавать указатель / ссылку на структуру, чтобы предотвратить эту ошибку?
Код, который приводит к ошибке (я пробовал несколько вариантов):
let mut ocParams : cParams = cParams::new(); //!!!!!! This is the struct passed
fInputParams(&ocParams); // !!!!!!! this is passing the struct
if !ocParams.tContinue {
return;
}
.......
struct cParams {
iInsertMax : i64,
iUpdateMax : i64,
iDeleteMax : i64,
iInstanceMax : i64,
tFirstInstance : bool,
tCreateTables : bool,
tContinue : bool
}
impl cParams {
fn new() -> cParams {
cParams {iInsertMax : -1, iUpdateMax : -1, iDeleteMax : -1, iInstanceMax : -1,
tFirstInstance : false, tCreateTables : false, tContinue : false}
}
}
.....
fn fInputParams(mut ocParams : &cParams) {
ocParams.tContinue = (sInput == ~"y"); // !!!!!! this is one of the error lines
Все присвоения полям структуры в функции приводят к ошибке во время компиляции. Пример ошибок, возникающих при компиляции:
testli007.rs:240:2: 240:20 error: cannot assign to immutable field
testli007.rs:240 ocParams.tContinue = (sInput == ~"y");
1 ответ
В объявлении вашей функции:
fn fInputParams(mut ocParams : &cParams) {
ocParams
изменяемая переменная, содержащая заимствованный указатель на неизменяемую структуру Вы хотите, чтобы эта структура была изменчивой, а не переменной. Следовательно, подпись функции должна быть:
fn fInputParams(ocParams : &mut cParams) {
Затем вы должны изменить сам вызов на fInputParams
:
fInputParams(&mut ocParams); // pass a pointer to mutable struct.