1

Valaは初めてですが、関数内のパラメーター変数を変更しようとすると、奇妙な問題が発生しているようです。たとえば、これは機能しません。

public string changeString(string input) {
    input = input.down();
    return input;
}

(このエラーが発生します:)Invalid assignment from owned expression to unowned variable: input = input.down();

ただし、これは機能します。

public string changeString(string input) {
    string temp = input;
    temp = temp.down();
    return temp;
}

パラメータ変数をValaで変更できないと考えるのは正しいですか?もしそうなら、なぜですか?そして、上記のものよりも良い回避策はありますか?

4

1 に答える 1

5

はいといいえ。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 ();
}
于 2012-05-21T20:12:14.013 に答える