为什么使用Rust会将可变结构传递给不可变字段中的函数结果?

时间:2013-10-29 03:15:08

标签: rust rust-0.8

我在Win8-64上使用0.8学习Rust。我有一个测试程序,我正在处理一个处理参数输入的函数返回一个包含这些参数的结构。这很好用。然后我改变了程序以将& 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

函数中struct结构字段的所有赋值都会在编译时导致错误。编译产生的错误示例:

testli007.rs:240:2: 240:20 error: cannot assign to immutable field
testli007.rs:240   ocParams.tContinue = (sInput == ~"y");   

1 个答案:

答案 0 :(得分:11)

在你的职能声明中:

fn fInputParams(mut ocParams : &cParams) {

ocParams是一个可变变量,包含一个借用指向不可变结构的指针。你想要的是该结构是可变的,而不是变量。因此,函数的签名应为:

fn fInputParams(ocParams : &mut cParams) {

然后您必须将呼叫本身更改为fInputParams

fInputParams(&mut ocParams);  // pass a pointer to mutable struct.