すべてがメモリ内の同じ場所を指す、所有されていない文字列の配列を返す方法は?
例:
init
var str = "ABC"
var unowned_string_array = repeat (str, 5)
def repeat (s: string, n: int): array of string
// code
この配列には 5 つの要素 (同じ文字列 "ABC") が含まれ、すべて同じ場所を指します。
私が得ることができる最も近い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 コメントを参照)。
これにはバグ報告さえあります。
したがって、これは問題なく機能します (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
Genie コードには、パーサーがarray of
.
これは、ネストされたジェネリック型で既に発生した問題と同様の問題のようです。