我是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中修改吗?如果是这样,为什么?还有比上面更好的解决方法吗?
答案 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 ();
}