我是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中修改?如果是这样,为什么?还有比上面更好的解决方法吗?
是的,不是.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)
| 归档时间: |
|
| 查看次数: |
1122 次 |
| 最近记录: |