【问题标题】:Genie how to return an array of unowned strings精灵如何返回一个无主字符串数组
【发布时间】:2015-10-01 14:24:06
【问题描述】:

如何返回一个数组,其中包含所有指向内存中相同位置的无主字符串

示例:

init
    var str = "ABC"
    var unowned_string_array = repeat (str, 5)

def repeat (s: string, n: int): array of string
    // code

这个数组将包含 5 个元素(相同的字符串“ABC”),都指向同一个位置

【问题讨论】:

标签: vala genie


【解决方案1】:

我能得到的最接近的 Vala 代码是:

int main() {
    var str = "ABC";
    var unowned_string_array = repeat (str, 5);
    return 0;
}

public (unowned string)[] repeat (string s, int n) {
    var a = new (unowned string)[n];
    for (var i = 0; i < n; i++)
        // This sadly still duplicates the string,
        // even though a should be an array of unowned strings
        a[i] = s; 
    return a;
}

我不确定编译器是否理解这里的括号,它可能认为我想在这里声明一个拥有字符串的无主数组...

更新:问题在于类型推断总是会创建一个拥有的变量(参见 nemequs 评论)。

甚至还有bug report for this

所以这很好用(repeat 函数中没有字符串重复):

int main() {
    var str = "ABC";
    (unowned string)[] unowned_string_array = repeat (str, 5);
    return 0;
}

public (unowned string)[] repeat (string s, int n) {
    (unowned string)[] a = new (unowned string)[n];
    for (var i = 0; i < n; i++)
        // This sadly still duplicates the string,
        // even though a should be an array of unowned strings
        a[i] = s;
    return a;
}

在 Genie 中会是这样的:

[indent=4]

init
    var str = "ABC"
    unowned_string_array: array of (unowned string) = repeat (str, 5)

def repeat (s: string, n: int): array of (unowned string)
    a: array of (unowned string) = new array of (unowned string)[n]
    for var i = 1 to n
        a[i] = s
    return a

由于解析器无法推断出array of 之后的内容,因此精灵代码存在无法编译的额外问题。

这似乎与我在nested generic types 中遇到的问题类似。

我有reported this a Genie bug

【讨论】:

  • 默认情况下,所有变量都是拥有的——当您使用类型推断时,您正在创建一个新的 owned 变量,即使右侧是无主的。如果您使用(unowned string)[] a = new (unowned string)[n];,则可以避免使用g_strdup。不过,对精灵一无所知,对不起。拥有的无主值数组是 Vala 中的一个新功能(几年前,IIRC),如果 Genie 没有更新,我不会感到惊讶。
  • 那么我们应该在 vala 编译器上提交一个错误报告吗?
  • 不会有伤害的。 TBH 我对 genie 还不够熟悉,无法明确告诉你,没有办法按照你的要求做,但语法似乎很可能……
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2011-04-21
  • 2011-07-27
相关资源
最近更新 更多