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

web*_*rc2 1 parameters vala

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

public string changeString(string input) {
    input = input.down();
    return input;
}
Run Code Online (Sandbox Code Playgroud)

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

但这确实有效:

public string changeString(string input) {
    string temp = input;
    temp = temp.down();
    return temp;
}
Run Code Online (Sandbox Code Playgroud)

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

nem*_*equ 5

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

有几种方法可以解决这个问题.第一个是使参数拥有:

public string changeString (owned string input) {
  input = input.down ();
  return input;
}
Run Code Online (Sandbox Code Playgroud)

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

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

public void changeString (ref string input) {
  input = input.down ();
}
Run Code Online (Sandbox Code Playgroud)

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

public string changeString (string input) {
  string temp = input.down ();
  return temp;
}
Run Code Online (Sandbox Code Playgroud)

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

public string changeString (string input) {
  return input.down ();
}
Run Code Online (Sandbox Code Playgroud)