1

私は Dart を初めて使用するので、ここに何か不足している可能性があります。

これは機能します:

main()の中に、私はこれを持っています:

var a = _someFunction;
var b = _someFunction;
print("${a == b}"); // true. correct!

_someFunction別のトップレベル関数はどこにありますか。

これは機能しません:(少なくとも私が期待している方法ではありません)

このクラスを考えると...

class Dummy {

    void start() {
        var a = _onEvent;
        var b = _onEvent;
        print(a == b); // false. ???????
    }

    void _onEvent() {
    }
}

からインスタンス化し、そのメソッドmain()を呼び出すと、 . コードが への参照を取得するたびに、何らかの関数またはクロージャ オブジェクトの新しいインスタンスが作成されて返されるようです。start()false_onEvent

これは意図的な動作ですか?

同じインスタンスの同じメソッドへの複数の参照を取得すると、毎回同じオブジェクトが返されると思います。おそらく、これは何らかの理由で意図されています。もしそうなら; なんの理由で?それとも、これはおそらく VM のバグ/見落とし/制限ですか?

洞察をありがとう!

4

2 に答える 2

1

現在、この動作は意図的なものと思われますが、2012 年 5 月以降、次の欠陥が公開されています: https://code.google.com/p/dart/issues/detail?id=144

于 2013-02-01T23:14:15.657 に答える
1

推測すると、「var a = _onEvent;」と設定すると思います。これは、関数と this の両方を含むある種のオブジェクトです。バインドされたメソッドを正規化するよう求めています。ただし、そのためにはチームがそれらのマップを作成する必要があり、メモリ リークの心配につながる可能性があります。

彼らは「var a = _someFunction;」を作ったと思います。const に割り当てることができるように、静的関数を定数にする必要があったためです。これは、彼らが次のようなものを書くことができるようにするためでした:

const logger = someStaticLoggingFunction;

これは、静的が遅延評価される前の時代でした。

いずれにせよ、クロージャーが等しいかどうかを比較することは、ほとんどの言語にとって特殊なケースであると言えます。上記のすべてを一粒の塩で取ってください。これは、システムに関する私の知識に基づく私の最善の推測です。私が知る限り、言語仕様はこれについて何も述べていません。

実際、( https://code.google.com/p/dart/issues/detail?id=144 )を読んだ今、議論は実際にはかなり良いものです。上に書いたことはほぼ一致しています。

于 2013-02-04T19:22:28.010 に答える