2016-11-01 10 views
1

用語集:マルチレベルシンボルとは、#barのような単一レベルの代わりに#Dummy.barのようなものです。それのためのより良い名前は何ですか、ごめんなさい、申し訳ありません。マルチレベル記号の使用例は何ですか?

シンボルはとても気の利いたものです。私はできる:

class Foo { 
static String hello() => "Said hello!"; 
} 

ClassMirror clMir = reflectType(Foo) as ClassMirror(); 
print(clMir.invoke(#hello, [])); 

それはを言った!。すばらしいです!

しかし、一つカントは行います

class Bar{ 
static final Bar bar = new Bar(); 
} 

ClassMirror clMir = reflectType(Bar) as ClassMirror(); 
print(clMir.invoke(#bar.hello, [])); 

これは失敗します。

また、reflectSymbol(#Dummy.bar)のようなマルチレベルのシンボルの反射を取得して、バーなどにInstanceMirrorを取得できる場所が見つかりませんでした。

マルチレベル記号の使用例はありますか?

答えて

1

さまざまなユースケースがあります。 主に、ライブラリ名(library foo.bar.baz;)を表します。ミラーシステムはそれを使用します(たとえば、https://api.dartlang.org/stable/1.20.1/dart-mirrors/MirrorSystem/findLibrary.htmlを参照)。

第2に、ミラーシステムでは、正確なクラスまたはライブラリのメンバ(https://api.dartlang.org/stable/1.20.1/dart-mirrors/DeclarationMirror/qualifiedName.html)を表すために、library.name.ClassName.memberNameのような「修飾名」としてミラーシステムが使用されることがあります。

ミラーシステム外ではそれほど有用ではありません。

+0

ありがとうございました。 ダーツのシンボルリテラルがより強力で、コードを完成し、アナライザーをチェックし、リファクタリングできることを望みます。 –

+0

シンボルは単なるダムデータなので、それらを完了することは実際には実行可能ではなく、文字列コンテンツを完成させる以上のものではありません。ほとんどの人は何にも使用しないでください(ほとんどの人はリフレクションを使用すべきではないという前提に基づいており、リフレクションを使用しない場合はシンボルは必要ありません)。 'Function.apply'関数と' noSuchMethod' 'Invocation'引数は、mirrorsライブラリの外にある反射関数であり、通常のユーザとしてシンボルに遭遇する可能性が最も高い場所です。 – lrn

+0

私は鏡が必要でない時にはそれを使いたくない。しかし、私はシンボルがアノテーションで非常に良いユースケースを持っていると思う。 1.メンバーなどを参照するソース生成で 2.角をつないでなど 一般的に文字列が使用されます。 Symbolリテラルがアナライザによる存在検出、IDE /アナライザによるコード補完、およびIDE /ダーツツールによる屈折をサポートする場合、大きなプラスになります。 例: クラスユーザー{ 文字列名; (AS#User.name、 '名称') } @EncodeFieldクラスシリアライザがMapSerializer { ...}を実装 –

関連する問題