2016-10-22 6 views
1
unowned string to_string() { 
    int x = 0; 
    return @"$x"; 
    // error: Return value transfers ownership but method return type 
    // hasn't been declared to transfer ownership 
} 

は機能しません。 unownedなしで動作します。(Vala)文字列テンプレートを持つ未所有の文字列戻り型

なぜですか?私が見た:Valaの中

リテラル文字列は、常にプログラムモジュール自体
によって所有されている - https://chebizarro.gitbooks.io/the-vala-tutorial/content/properties_ownership.html

に通常の文字列リテラル、文字列テンプレートとは対照的に、プログラムモジュールによってownedではないでしょうか?私は何か誤解していますか?

答えて

2

文字列テンプレートはリテラル文字列ではありません。

リテラルはコンパイル時に計算できるため、コンパイラはコンパイルされたプログラムに文字列のコピーを単純に含めます。文字列テンプレートOTOHは一般にコンパイル時にはわかりません(xをパラメータとして渡すか、インスタンス変数またはグローバル変数から渡す場合)、ヒープ上にメモリが割り当てられ、文字列の内容は次のようになります。実行時に計算されます。

別の言い方をすれば、文字列テンプレートは基本的にstring.printf(またはCの観点からはg_strdup_printf)の呼び出しのための構文的な砂糖です。

2

文字列テンプレートは、使用時に自動的に「呼び出し」されます。

したがって、実際のテンプレートリテラルがプログラムモジュールによって所有されている場合、結果の文字列は通常の所有文字列(一時変数内)になります。

したがって、文字列テンプレートの結果は、プログラムモジュールによって所有されていませんが、それが存在するメソッドによって所有されます。したがって、コンパイラのメッセージは正しいです。

2

文字列テンプレートは、文字列と変数を連結するための短い手です。だからあなたのプログラムは、相当と考えることができます。

void main() { 
    string a = example(); 
} 

unowned string example() { 
    int x = 0; 
    return "" + x.to_string(); 
} 

文字列テンプレートは、あなたのためのto_string()メソッドを呼び出します。上記の例でも同じエラーが発生します。おそらく、エラーメッセージはそれほど役に立ちませんが、なぜあなたが所有されていない文字列を返すのかを考慮する必要があります。

文字列を所有しないと、文字列のValaのメモリ管理が無効になります。これは、定数が返されている場合に関係するかもしれませんが、あなたの例では、実行時に文字列が作成されているので、ヒープ上に割り当てられます。つまり、Valaのメモリ管理を使いたいということです。一般に、Valaにメモリ管理のデフォルト設定を使用させる必要があります。

関連する問題