如何返回一個數組 of 無主字符串所有指向內存中的相同位置?精靈如何返回一個無主數組字符串
例如:
init
var str = "ABC"
var unowned_string_array = repeat (str, 5)
def repeat (s: string, n: int): array of string
// code
和此陣列將包含5個元素(相同的字符串 「ABC」),都指向相同的位置
如何返回一個數組 of 無主字符串所有指向內存中的相同位置?精靈如何返回一個無主數組字符串
例如:
init
var str = "ABC"
var unowned_string_array = repeat (str, 5)
def repeat (s: string, n: int): array of string
// code
和此陣列將包含5個元素(相同的字符串 「ABC」),都指向相同的位置
最接近瓦拉代碼我能得到的是:
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。
默認情況下,所有變量都是擁有的 - 當您使用類型推斷時,您正在創建一個新的*擁有*變量,即使右手邊是無主的。如果你做'(unowned string)[] a = new(unownned string)[n];'你可以避免'g_strdup'。雖然不知道精靈,對不起。擁有無限值的數組是一個新的(幾年前,IIRC)功能在Vala,我不會感到驚訝,如果精靈沒有更新。 – nemequ
那麼我們應該在vala編譯器上爲此提交一個錯誤報告? –
它不會傷害。 TBH對於精靈來說,我不夠熟悉,無法確切地告訴你,沒有辦法去做你正在問的東西,但它似乎可能是語法...... – nemequ
我已經嘗試過解決這個問題,但是這裏的語法很棘手。我在這裏找到了一個相關的郵件列表:http://osdir.com/ml/vala-list/2009-12/msg00046.html –