- var hoge;
- final hoge;
初期化されていない変数は初期値は null
main() {
final name = "droid";
var age = 4;
var favor = 'ics';
// コンソールに出力
print("Hello, my name is ${name}.");
print('I like ' + favor + '!');
}
文字列に変数を埋め込む方法
- "Hello, ${name}"
- 'Hello, $name'
- 'Hello' + name
@"..." で /n などが無視される raw string になる
■ クラス
class Hoge {}
class Droid {
var name = 'droid';
greet(favor) {
print("Hello, my name is ${name}.");
print('I like ' + favor + '!');
}
}
main () {
var droid = new Droid();
droid.greet('ics');
}
dart では全てのクラスは Object クラスを継承している non-Object クラスを継承したい場合は extends を使う
通常の変数と同じように、生成したクラスのインスタンス変数には var か final もしくは各タイプを使う必要がある
コンストラクタを明示的に定義していない場合は、引数なしのコンストラクタが定義されていることになる
コンストラクタを明示的に定義した場合は、引数なしのコンストラクタも必要な場合は明示的に定義する必要がある
class Droid {
var name = 'droid';
// コンストラクタ
Droid();
Droid.withName(this.name);
greet(favor) {
print("Hello, my name is ${name}.");
print('I like ' + favor + '!');
}
}
main () {
var droid = new Droid.withName('dronjo');
droid.greet('gingerbread');
}
getter と setter
_ で始まる変数は private になる。それ以外は public になる。
class Droid {
String _name = 'droid'; // private
String get name() => _name; // getter
void set name(String name) { // setter
if(name == null) name = "";
if(name.length > 20) throw 'name is too long!';
_name = name;
}
greet(favor) {
print("Hello, my name is ${name}.");
print('I like ' + favor + '!');
}
}
main () {
var droid = new Droid();
droid.name = 'dronjo';
droid.greet('gingerbread');
}
■ Interfaces
implements Hoge
class Droid implements Comparable {
String name = 'droid'; // private
// コンストラクタ
Droid();
Droid.withName(this.name);
greet(String text) => print('$name, $text');
int compareTo(Droid d) => name.compareTo(d.name);
}
main () {
var droid = new Droid();
droid.name = 'dronjo';
var droid2 = new Droid.withName('dronjo');
droid.greet('gingerbread');
num result = droid2.compareTo(droid);
if(result == 0) {
droid2.greet('you are the same.');
} else {
droid2.greet('you are different.');
}
}
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 -> int
var one = Math.parseInt("1"); // 1
// string -> double
var onePointOne = Math.parseDouble("1.1"); // 1.1
// int -> string
String oneAsString = 1.toString(); // "1"
// double -> string
String piAsString = 3.14159.toStringAsFixed(2); // "3.14"
JavaScript と違って、bool は 1 や non-null オブジェクトを true としては扱わない
■ List
// 可変長リスト
var list = [1,2,3];
// リストの長さ
print(list.length);
// 要素の取得
print(list[1]);
// 要素の追加
list.add(4);
// 要素の削除
list.removeRange(2, 1);
// 固定長リスト
var list = new List(4);
Iterating
for...in
var list = [1,2,3];
for (final x in list) {
print(x);
}
forEach()
var list = [1,2,3];
void printElement(element) => print(element);
list.forEach(printElement);
var list = [1,2,3];
list.forEach((element) => print(element));
List document
Collection document
■ Map
var gifts = {
// keys values
"first" : "partridge",
"second" : "turtledoves",
"fifth" : "golden rings"};
key は string でなければならない
Map のコンストラクタを使ったり、Hashable を実装した別のオブジェクトを使えば key の他のタイプを使うことができる
// Map コンストラクタを使う
var map = new Map();
map[1] = "partridge";
map[2] = "turtledoves";
map[5] = "golden rings";
value は任意のオブジェクトもしくは null を取ることができる
存在しない key の value を取得しようとすると null が返ってくるが、そもそも value は null を取ることができるので、 containsKey() や putIfAbsent() でチェックする
var gifts = { "first": "partridge" };
gifts["fourth"] = "calling birds";
// 長さ
print(gifts.length);
// 削除
gifts.remove('first');
// コピー
var regifts = new Map.from(gifts);
print(regifts['first']);
Iterating
forEach()
var gifts = {
"first" : "partridge",
"second": "turtledoves",
"fifth" : "golden rings"};
gifts.forEach((k,v) => print('$k : $v'));
forEach() で返ってくる key-value ペアの順番は保証されていないので、依存しないようにする
keys や values だけ必要な場合は getKeys(), getValues() でそれぞれの Collection オブジェクトが取得できる
var gifts = {"first": "partridge", "second": "turtledoves"};
var values = gifts.getValues();
values.forEach((v) => print(v));
Map document
Hashable document
■ Functions
=> e シンタックスは {return e;} の短縮形
関数引数を [] を囲むと、オプショナルな引数になる
String say(String from, String msg, [String device]) {
var result = "$from says $msg";
if (device != null) {
result = "$result with a $device";
}
return result;
}
オプショナルな引数に初期値をセットすることもできる
String say(String from, String msg, [String device='carrier pigeon']) {
var result = "$from says $msg";
if (device != null) {
result = "$result with a $device";
}
return result;
}
オプショナルな引数の名前を指定してセットすることもできる
print(say("Bob", "Howdy", device: "tin can and string"));
function をパラメータとして別の function に渡すことができる
bool isOdd(num i) => i % 2 == 1;
List ages = [1,4,5,7,10,14,21];
List oddAges = ages.filter(isOdd);
より短縮したバージョン
List ages = [1,4,5,7,10,14,21];
List oddAges = ages.filter((i) => i % 2 == 1);
function を変数に割り当てることもできる
var loudify = (msg) => '!!! ${msg.toUpperCase()} !!!';
print(loudify('hello'));
Lexical closures もつくれる
Function makeAdder(num n) {
return (num i) => n + i;
}
main() {
var add2 = makeAdder(2);
print(add2(3)); // 5
}
■ Exceptions
try {
breedMoreLlamas();
} catch (final OutOfLlamasException e) { // a specific exception
buyMoreLlamas();
} catch (final Exception e) { // anything that is an exception
print("Unknown exception: $e");
} catch (final e) { // no specified type, handles all
print("Something really unknown: $e");
}
finally
try {
breedMoreLlamas();
} catch (final e) {
print("Error: $e"); // handle exception first
} finally {
cleanLlamaStalls(); // then run finally
}
Exception document
■ 参考
- Language Tour
- Dart Style Guide
Dart Style Guide の規定では、インデントは 2 spaces - Language Specification
0 件のコメント:
コメントを投稿