0

コードが出力されます

1
2
2

1回だけ印刷します。魔神でそれを書く方法がわかりません。

以下はvalaコードです:

public static void main() {
    var a = new One();
    var b = new One();
}

class One : Object {
    class construct {
        stdout.puts("1\n");
    }
    public One () {
        stdout.puts("2\n");
    }
}

genieの同等のコード クラス コンストラクトメソッドは何ですか?

ジーニーの初期化なら?(NOW) それは、vala のクラス構造とは異なりますか?

ジーニーの初期

以下は動作しません!

init
    var a = new One
    var b = new One

class One
    construct ()
        stdout.puts("2\n")
    init
        stdout.puts("1\n")

コンストラクト ブロックには GLib.object が必要です

コンストラクト ブロック => 初期化ブロック

しかし、Vala のクラス構成はそうではありません。

vala は機能しますが、Genie は機能しません。

ヴァラコード:

class One {
    class construct {
        stdout.puts("1\n");
    }
    public One () {
        stdout.puts("2\n");
    }
}

この機能が役立つ理由 実際、私は以前にクラスを使用したことがありません。しかし、私はそれが便利だと思います、非常に便利です。

例:いくつかの静的フィールドを初期化します(またはクラスフィールド:別の質問です)。

どうしてか分かりません?Vala がこの機能を実装する理由 Vala が実装してくれればきっと役に立つに違いない。

4

1 に答える 1

2

私がそれだと思ったドキュメンテーションから私が言えることからinit。なぜあなたがそれを使いたいのかはわかりませんが。クラスのすべてのインスタンスで使用される静的データの遅延ロードには役立つかもしれませんが、私はそれを自分で行ったことはありません。

オブジェクト指向プログラミングの用語では、クラスはオブジェクトとして作成されるときに「インスタンス化」されます。インスタンス化のプロセスは、「コンストラクター」でカスタマイズできます。Vala と Genie では、「デストラクタ」を使用して、オブジェクトが不要になったときのプロセスをカスタマイズすることもできます。

メソッドがオブジェクト内のデータに作用しない場合、それはstaticメソッドと呼ばれます。定義上、コンストラクターはオブジェクト内のデータには作用しませんが、新しいオブジェクトを返します。したがって、コンストラクターは常に静的でstatic constructあり、間違った名前です。Valaにはそれがclass constructあり、それを使用するようにコードを変更すると、同じ結果が得られます。Valaでのこのテーマの完全な扱いについては、Vala のさまざまなタイプのコンストラクターを参照してください。についての部分class constructは最後にあります。

私の理解では、Genie'sinitは Vala's と同等でしたclass construct。あなたの質問により、Genie の問題が明らかになったと思います。私の理解では、このコードはあなたの質問に答えるでしょう:

[indent = 4]
init
    var a = new One()
    var b = new One()
    var c = new One.alternative_constructor()

class One:Object
    init
        print "Class 'One' is registered with GType"

    construct()
        print "Object of type 'One' created"

    construct alternative_constructor()
        print """Obect of type 'One' created with named constructor
'alternative_constructor', but the design of your
class is probably too complex if it has multiple
constructors."""

    def One()
        print "This is not a constructor"

    final
        print "Object of type 'One' destroyed"

ただし、これは次のように出力します。

Class 'One' is registered with GType
Object of type 'One' created
Class 'One' is registered with GType
Object of type 'One' created
Class 'One' is registered with GType
Obect of type 'One' created with named constructor 
'alternative_constructor', but the design of your 
class is probably too complex if it has multiple 
constructors.
Object of type 'One' destroyed
Object of type 'One' destroyed
Object of type 'One' destroyed

GType への登録は一度しか行われないため、initコードが間違った場所に配置され、型登録ではなくインスタンス化ごとに呼び出されます。class constructしたがって、現時点では、ジーニーにヴァラに相当するものはないと思います。

の動作を変更するinitことは 1 つの解決策かもしれませんが、元の目的を誤解している可能性があり、現在の動作に依存するコードが多数存在する可能性があります。もう 1 つの解決策は、これを実装する Genie パーサーのパッチを作成することです。この機能が便利な理由を説明する必要があります。

于 2016-01-10T15:44:24.367 に答える