1

我是 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 中修改是否正确?如果是这样,为什么?还有比上述更好的解决方法吗?

4

1 回答 1

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 时立即释放它线)。这样的事情更有意义:

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

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

public string changeString (string input) {
  return input.down ();
}
于 2012-05-21T20:12:14.013 回答