【问题标题】:Can Vala function parameter variables be modified?vala函数参数变量可以修改吗?
【发布时间】:2012-05-22 04:12:14
【问题描述】:

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

【问题讨论】:

    标签: parameters vala


    【解决方案1】:

    是和不是。 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 ();
    }
    

    【讨论】:

    • “当然,你真的不需要临时变量……”是的,我知道。这只是一个快速演示。我需要做其他操作。我将浏览您发送给我的链接并再次测试。如果它加起来并在代码中起作用,我可能会选择你的答案(除非有人写了更好的答案,但你的答案非常彻底,所以我看不到这种情况发生)。谢谢。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    相关资源
    最近更新 更多