2012年4月3日火曜日

Hello Dart 2

変数の定義
  • var hoge;
  • final hoge;
_ で始まる変数は private になる。それ以外は public になる。
初期化されていない変数は初期値は null
  1. main() {  
  2.   final name = "droid";  
  3.   var age = 4;  
  4.   var favor = 'ics';  
  5.   
  6.   // コンソールに出力  
  7.   print("Hello, my name is ${name}.");  
  8.   print('I like ' + favor + '!');  
  9. }  
文字列に変数を埋め込む方法
  • "Hello, ${name}"
  • 'Hello, $name'
  • 'Hello' + name
複数行の文字列は '''...''' もしくは """...""" で表現できる
@"..." で /n などが無視される raw string になる


■ クラス

class Hoge {}
  1. class Droid {  
  2.   var name = 'droid';  
  3.   
  4.   greet(favor) {  
  5.     print("Hello, my name is ${name}.");  
  6.     print('I like ' + favor + '!');  
  7.   }  
  8. }  
  9.   
  10. main () {  
  11.   var droid = new Droid();  
  12.   droid.greet('ics');  
  13. }  

dart では全てのクラスは Object クラスを継承している non-Object クラスを継承したい場合は extends を使う

通常の変数と同じように、生成したクラスのインスタンス変数には var か final もしくは各タイプを使う必要がある

コンストラクタを明示的に定義していない場合は、引数なしのコンストラクタが定義されていることになる
コンストラクタを明示的に定義した場合は、引数なしのコンストラクタも必要な場合は明示的に定義する必要がある
  1. class Droid {  
  2.   var name = 'droid';  
  3.   
  4.   // コンストラクタ  
  5.   Droid();  
  6.   Droid.withName(this.name);  
  7.   
  8.   greet(favor) {  
  9.     print("Hello, my name is ${name}.");  
  10.     print('I like ' + favor + '!');  
  11.   }  
  12. }  
  13.   
  14. main () {  
  15.   var droid = new Droid.withName('dronjo');  
  16.   droid.greet('gingerbread');  
  17. }  
getter と setter

_ で始まる変数は private になる。それ以外は public になる。
  1. class Droid {  
  2.   String _name = 'droid';  // private  
  3.   
  4.   String get name() => _name;  // getter  
  5.   
  6.   void set name(String name) {  // setter  
  7.     if(name == null) name = "";  
  8.     if(name.length > 20) throw 'name is too long!';  
  9.     _name = name;  
  10.   }  
  11.   
  12.   greet(favor) {  
  13.     print("Hello, my name is ${name}.");  
  14.     print('I like ' + favor + '!');  
  15.   }  
  16. }  
  17.   
  18. main () {  
  19.   var droid = new Droid();  
  20.   droid.name = 'dronjo';  
  21.   droid.greet('gingerbread');  
  22. }  


■ Interfaces

implements Hoge
  1. class Droid implements Comparable {  
  2.   String name = 'droid';  // private  
  3.   
  4.   // コンストラクタ  
  5.   Droid();  
  6.   Droid.withName(this.name);  
  7.   
  8.   greet(String text) => print('$name, $text');  
  9.     
  10.   int compareTo(Droid d) => name.compareTo(d.name);  
  11. }  
  12.   
  13. main () {  
  14.   var droid = new Droid();  
  15.   droid.name = 'dronjo';  
  16.   
  17.   var droid2 = new Droid.withName('dronjo');  
  18.   droid.greet('gingerbread');  
  19.   
  20.   num result = droid2.compareTo(droid);  
  21.   if(result == 0) {  
  22.     droid2.greet('you are the same.');  
  23.   } else {  
  24.     droid2.greet('you are different.');  
  25.   }  
  26. }  
int は primitive ではなく、interface!

Optional types (実態は interfaces)
String, num, int (num を継承), double (num を継承), 等
自分で static な type を追加することもできる
final を加えて定義できる final String hoge;


Built-in types
  • String
  • StringBuffer
  • num
  • int (num を継承)
  • double (num を継承)
  • bool
  • List (JavaScript の array にコンパイルされる)
  • Map
String <--> in, double 変換
  1. // string -> int  
  2. var one = Math.parseInt("1");                   // 1  
  3.   
  4. // string -> double  
  5. var onePointOne = Math.parseDouble("1.1");      // 1.1  
  6.   
  7. // int -> string  
  8. String oneAsString = 1.toString();              // "1"  
  9.   
  10. // double -> string  
  11. String piAsString = 3.14159.toStringAsFixed(2); // "3.14"  
JavaScript と違って、bool は 1 や non-null オブジェクトを true としては扱わない



■ List
  1. // 可変長リスト  
  2. var list = [1,2,3];  
  3.   
  4. // リストの長さ  
  5. print(list.length);  
  6.   
  7. // 要素の取得  
  8. print(list[1]);  
  9.   
  10. // 要素の追加  
  11. list.add(4);  
  12.   
  13. // 要素の削除  
  14. list.removeRange(2, 1);  
  1. // 固定長リスト  
  2. var list = new List(4);  
Iterating

for...in
  1. var list = [1,2,3];  
  2. for (final x in list) {  
  3.   print(x);  
  4. }  

forEach()
  1. var list = [1,2,3];  
  2. void printElement(element) => print(element);  
  3. list.forEach(printElement);  
  1. var list = [1,2,3];  
  2. list.forEach((element) => print(element));  
List document
Collection document


■ Map
  1. var gifts = {  
  2. // keys       values  
  3.   "first"  : "partridge",  
  4.   "second" : "turtledoves",  
  5.   "fifth"  : "golden rings"};  

key は string でなければならない
Map のコンストラクタを使ったり、Hashable を実装した別のオブジェクトを使えば key の他のタイプを使うことができる
  1. // Map コンストラクタを使う  
  2. var map = new Map();  
  3. map[1] = "partridge";  
  4. map[2] = "turtledoves";  
  5. map[5] = "golden rings";  
value は任意のオブジェクトもしくは null を取ることができる
存在しない key の value を取得しようとすると null が返ってくるが、そもそも value は null を取ることができるので、 containsKey()putIfAbsent() でチェックする
  1. var gifts = { "first""partridge" };  
  2. gifts["fourth"] = "calling birds";  
  3.   
  4. // 長さ  
  5. print(gifts.length);  
  6.   
  7. // 削除  
  8. gifts.remove('first');  
  9.   
  10. // コピー  
  11. var regifts = new Map.from(gifts);  
  12. print(regifts['first']);   

Iterating

forEach()
  1. var gifts = {  
  2.   "first" : "partridge",  
  3.   "second""turtledoves",  
  4.   "fifth" : "golden rings"};  
  5. gifts.forEach((k,v) => print('$k : $v'));  
forEach() で返ってくる key-value ペアの順番は保証されていないので、依存しないようにする

keys や values だけ必要な場合は getKeys(), getValues() でそれぞれの Collection オブジェクトが取得できる
  1. var gifts = {"first""partridge""second""turtledoves"};  
  2. var values = gifts.getValues();  
  3. values.forEach((v) => print(v));  
Map document
Hashable document


■ Functions

=> e シンタックスは {return e;} の短縮形

関数引数を [] を囲むと、オプショナルな引数になる
  1. String say(String from, String msg, [String device]) {  
  2.   var result = "$from says $msg";  
  3.   if (device != null) {  
  4.     result = "$result with a $device";  
  5.   }  
  6.   return result;  
  7. }  
オプショナルな引数に初期値をセットすることもできる
  1. String say(String from, String msg, [String device='carrier pigeon']) {  
  2.   var result = "$from says $msg";  
  3.   if (device != null) {  
  4.     result = "$result with a $device";  
  5.   }  
  6.   return result;  
  7. }  
オプショナルな引数の名前を指定してセットすることもできる
  1. print(say("Bob""Howdy", device: "tin can and string"));  
function をパラメータとして別の function に渡すことができる
  1. bool isOdd(num i) => i % 2 == 1;  
  2. List ages = [1,4,5,7,10,14,21];  
  3. List oddAges = ages.filter(isOdd);  
より短縮したバージョン
  1. List ages = [1,4,5,7,10,14,21];  
  2. List oddAges = ages.filter((i) => i % 2 == 1);  
function を変数に割り当てることもできる
  1. var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';  
  2. print(loudify('hello'));  
Lexical closures もつくれる
  1. Function makeAdder(num n) {  
  2.   return (num i) => n + i;  
  3. }  
  4.   
  5. main() {  
  6.   var add2 = makeAdder(2);  
  7.   print(add2(3)); // 5  
  8. }  



■ Exceptions
  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final OutOfLlamasException e) {  // a specific exception  
  4.   buyMoreLlamas();  
  5. catch (final Exception e) {             // anything that is an exception  
  6.   print("Unknown exception: $e");  
  7. catch (final e) {                       // no specified type, handles all  
  8.   print("Something really unknown: $e");  
  9. }  
finally
  1. try {  
  2.   breedMoreLlamas();  
  3. catch (final e) {  
  4.   print("Error: $e");  // handle exception first  
  5. finally {  
  6.   cleanLlamaStalls();  // then run finally  
  7. }  
Exception document


■ 参考



0 件のコメント:

コメントを投稿