2015-07-13 49 views
1

如何返回一個數組 of 無主字符串所有指向內存中的相同位置?精靈如何返回一個無主數組字符串

例如:

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

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

和此陣列將包含5個元素(相同的字符串 「ABC」),都指向相同的位置

+0

我已經嘗試過解決這個問題,但是這裏的語法很棘手。我在這裏找到了一個相關的郵件列表:http://osdir.com/ml/vala-list/2009-12/msg00046.html –

回答

2

最接近瓦拉代碼我能得到的是:

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; 
} 

這將是這樣的精靈:

[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

+2

默認情況下,所有變量都是擁有的 - 當您使用類型推斷時,您正在創建一個新的*擁有*變量,即使右手邊是無主的。如果你做'(unowned string)[] a = new(unownned string)[n];'你可以避免'g_strdup'。雖然不知道精靈,對不起。擁有無限值的數組是一個新的(幾年前,IIRC)功能在Vala,我不會感到驚訝,如果精靈沒有更新。 – nemequ

+0

那麼我們應該在vala編譯器上爲此提交一個錯誤報告? –

+0

它不會傷害。 TBH對於精靈來說,我不夠熟悉,無法確切地告訴你,沒有辦法去做你正在問的東西,但它似乎可能是語法...... – nemequ

相關問題