2017-03-05 7 views
2

ここに新しいVala ...プロパティとgetters/setterの違いを理解しようとしています。Valaの関数とプロパティの違い

public class Person { 
    public string name { 
    get { 
     XPath.NodeSet* nodes = search (node, "/name"); 
     return nodes->item (0)->get_content(); 
    } 
    } 

    public string get_name() { 
    XPath.NodeSet* nodes = search (node, "/name"); 
    return nodes->item (0)->get_content(); 
    } 
} 

第2のget_name()ファンクションは期待どおり機能します。プロパティはそうではありません。それはスローされます:

Return value transfers ownership but function return type hasn't been declared to transfer ownership 
     return nodes->item (0)->get_content(); 
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

私はここで何が欠けていますか? get_content()は文字列を返さないか、関数の解決法は変換マジックを行うのですか?

ありがとうございます!

答えて

2

通常、関数は所有値を返します(呼び出し元はフリーでなければなりません)が、プロパティgetterは所有者でない値を返します(呼び出し元は解放してはいけません)。したがって、get_context()によって返されたメモリは割り当てが解除され、ぶら下がりポインタが返されます。値のプロパティの戻り値は、他の所で所有されている値(例えば、、フィールド内では)でバックアップするか、所有する戻り値の型を変更してValaが値のコピーを作成する必要があります。

+0

ありがとうございます、私はそれを知っています。私は、メモリ内の値を保持するために "クラス変数"(Rubyの言葉で)が必要です! – Cimm

+1

いいえ、Rubyのクラス変数はValaの静的変数です。フィールド(インスタンス変数)、クラス変数、定数、または他のクラスの定数のいずれかになります。 – apmasell

関連する問題