可以修改Vala函数参数变量吗?

时间:2012-05-21 14:58:52

标签: parameters vala

我是Vala的新手,但是当我尝试修改函数中的参数变量时,我似乎遇到了一个奇怪的问题。例如,这不起作用:

public string changeString(string input) {
    input = input.down();
    return input;
}

(我收到此错误:) Invalid assignment from owned expression to unowned variable: input = input.down();

然而,这确实有效:

public string changeString(string input) {
    string temp = input;
    temp = temp.down();
    return temp;
}

我认为参数变量无法在Vala中修改吗?如果是这样,为什么?还有比上面更好的解决方法吗?

1 个答案:

答案 0 :(得分:5)

是和否。 Vala中的参数默认是无主的(如果您不知道这意味着什么,请参阅https://live.gnome.org/Vala/Tutorial#Ownership)。您可以分配给无主变量(包括参数),但只能将无主值分配给无主变量。这里的问题是string.down的返回值是拥有的,并且您正在尝试将其分配给无主变量。这是不允许的,因为那时Vala无法知道它是否应该在方法结束时释放字符串。

有几种方法可以解决这个问题。第一个是让论证拥有:

public string changeString (owned string input) {
  input = input.down ();
  return input;
}

这通常不是一个好主意,因为这意味着当你调用changeString时,Vala必须复制(g_strdup)输入字符串,这是一种浪费。

相关功能是参数方向(参见https://live.gnome.org/Vala/Tutorial#Parameter_Directions)。如果您想要就地修改输入,可以执行以下操作:

public void changeString (ref string input) {
  input = input.down ();
}

在temp变量中输入一个输入的副本(就像你在第二个例子中所做的那样)并没有多大意义......它会在方法的第一行复制字符串,然后在覆盖temp时立即释放它在下一行)。这样的事情更有意义:

public string changeString (string input) {
  string temp = input.down ();
  return temp;
}

当然,你真的不需要临时变量...

public string changeString (string input) {
  return input.down ();
}