はいといいえ。Valaの引数は、デフォルトでは所有されていません(意味がわからない場合は、https: //live.gnome.org/Vala/Tutorial#Ownershipを参照してください)。所有されていない変数(引数を含む)に割り当てることができますが、所有されていない変数に割り当てることができるのは所有されていない値のみです。ここでの問題は、string.downの戻り値が所有されており、それを所有されていない変数に割り当てようとしていることです。これは許可されていません。Valaは、メソッドの最後で文字列を解放する必要があるかどうかを知る方法がないためです。
これを回避する方法はいくつかあります。1つ目は、引数を所有することです。
public string changeString (owned string input) {
input = input.down ();
return input;
}
これは、changeStringを呼び出すときに、Valaが入力文字列をコピー(g_strdup)する必要があることを意味するため、通常はお勧めできません。これは一種の無駄です。
関連する機能はパラメーターの方向です(https://live.gnome.org/Vala/Tutorial#Parameter_Directionsを参照)。入力をインプレースで変更する場合は、次のようにすることができます。
public void changeString (ref string input) {
input = input.down ();
}
入力のコピーを一時変数に入れることは(2番目の例で行ったように)実際には意味がありません...メソッドの最初の行の文字列をコピーし、次の一時変数を上書きするとすぐに解放されますライン)。このようなものはより理にかなっています:
public string changeString (string input) {
string temp = input.down ();
return temp;
}
もちろん、一時変数は本当に必要ありません...
public string changeString (string input) {
return input.down ();
}