2013-04-12 26 views
6

不明な型の値を返す関数がある場合は、オブジェクトを表すdynamicを使用しますか、他のすべての型の祖先であるObjectを使用しますか?Dartでは、型がわからない場合は関数の戻り値にdynamicまたはObjectを注釈を付ける必要がありますか?

style guideでは、この質問についてはパラメータについて説明しますが、戻り値については説明しません。

戻り値にはどのように注釈を付ける必要がありますか?

答えて

6

ダートエンジニアボブ・ナイストロームは書いている:

戻り値の型が、この問題についての興味深いひねりあります。パラメータの型では、ガイドラインは非常に簡単です:あなたは、パラメータの種類としてObjectを使用する場合は、「言っている

  1. 私の方法は、安全に任意のオブジェクトを受け入れ、唯一toString()すべてのオブジェクトのサポートのようなもののためにそれを使用します"

  2. dynamic(または何もありません)をパラメータタイプとして使用すると、「ダーツのタイプシステムでは、ここで受け入れるタイプを簡単に表現できません」または「注釈を付けるのは面倒ではありません。

(1)を回すのは難しいです。戻り値の型の場合、Objectは、「toString()以外のものを呼び出すのは他のすべてのオブジェクトがサポートしています。型テストを自分で実行する前にサポートしています」というメッセージが表示されます。dynamic私はこれを簡単に注釈することはできません私たちがやっていることをもっとよく知っているだけです "。

ユーザは、コンパイラの警告を避けるために、特定のタイプに「キャスト」し、チェックモードでエラーを早期に取得する必要があります。

多くの場合、Objectを返す場合でも、キャストする必要はありません。ダートでは、型の注釈でローカル変数を初期化するときに暗黙のダウンキャストが可能です。だから、あなたが行うことができます:私はこのケースで考える

Object foo() => 123; 

main() { 
    int x = foo(); // Implicit downcast. No type warning. 
} 

を、私はおそらくしかし、dynamicを行うだろう。私は、 "これはどんなタイプが返ってくるのか分からないが、あなたは" Objectよりも良いはずだと伝えていると思う。

+0

あなたの答えは非常に便利ですが、あなたの例は「ダーツの言語」ではないので正しくありません。 Dart式 'int foo();'は有効な式ではありません。 'int i = foo();'と書いておきたいかもしれませんか? – mezoni

関連する問題