1. newta

    Posted

    newta
Changes in title
+Ceylonの良いとこコードその1
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,178 @@
+今回は
+[Ceylon言語ってどんなもの?](http://qiita.com/newta/items/2ca98051450c4751b4b1)
+で紹介したCeylonの良いとこをコードで紹介。
+
+Ceylon開発環境は [Ceylon環境の作り方](http://qiita.com/newta/items/d84200874645fa5cef26)からどうぞ。
+
+
+#リテラル定義が便利
+Javaは定義のときが固過ぎてListやMapを定義したいときに不便だなーと感じるところがありますが
+その辺が改善されています。
+(Java8でちょっと改善されそうだけど、まだリリースされないんだよね・・・。)
+
+配列はいつものように出来ます
+
+```ceylon
+String[] a = ["a","b","c"];
+Integer[][] b = [[2, 3], [5, 7], [11, 13]];
+````
+
+Listで受け取ればListになっちゃいます。
+
+```ceylon
+List<String> a2 = ["a","b","c"];
+List<List<Integer>> b2 = [[2, 3], [5, 7], [11, 13]];
+````
+
+もちろんジェネリクスも効いているので型は安全。
+
+Mapも出来ます。
+
+```ceylon
+Map<String,String> m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
+````
+
+key -> valueの順で宣言して「,」で複数できます。
+簡単ですね!
+
+#静的型付けである
+なんと言ってもJava好きな人はこれは重要な事項だと思います。
+メソッドやフィールドの参照先は正確に飛べるし、
+間違ったメソッド名などでは事前にコンパイルエラーで教えてくれるし
+静的な型付けのメリットはありますよねー。
+動的なのが好みの人にはわずらわしいと感じる部分もあるけど
+保守とか長い目で見ると便利な面が多いかなーと個人的には思ってます。
+
+```ceylon
+ List<List<Integer>> a = [[2, 3], [5, 7], [11, 13]];
+ print(a.get(1)); // [5,7]
+ print(a.hoge()); // コンパイルエラー
+````
+
+定義されていないメソッドがあれば当然コンパイルエラーになります。
+実行されるまで分からない動的言語との違いかなと思います。
+
+#型推論がある
+先ほどのList宣言されたものですが、
+
+```ceylon
+value a = [[2, 3], [5, 7], [11, 13]];
+````
+のように書き換えることが出来る。
+
+```ceylon
+ value s = "hoge"; // String
+ value i = 1; // Integer
+ value f = 1.0; // Float
+````
+上記のように宣言すれば
+それぞれvalueと指定されていても
+コメントでの型として処理されるので楽です。
+
+型も効きつつ、手軽に宣言出来ます。
+特にネストされたListやMapなどは楽になります。
+
+リテラル定義のときに出てきた
+
+```ceylon
+Map<String,Object> m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
+````
+このコードも
+
+```ceylon
+value m = LazyMap{ "test"->"hogehoge", "foo"->"bar" };
+````
+とすればMap<String,String>として利用出来ます。
+
+#デフォルトで変数のnull禁止
+
+```ceylon
+String s1 = null; // コンパイルエラー
+````
+上記のように普通に宣言しただけではnullをセット出来ず
+コンパイルエラーとなります。
+
+nullをセット出来る変数を作成するには「?」を型の名前の後ろにつけます。
+
+```ceylon
+String? s1 = null;
+````
+さらにnullを許容する変数を参照して呼び出す場合
+existsでチェックしたスコープの中でしか使うことが出来ません。
+
+```ceylon
+String? s2 = "hoge";
+print(s2.size); // コンパイルエラー
+````
+上記のコードではコンパイルエラーになります。
+
+nullを許容する変数を使うには以下のようにします。
+
+```ceylon
+String? s2 = "hoge";
+if(exists s2) {
+ print(s2.size);
+}
+````
+
+これでJavaで悩まされていたnullの扱いを制限し
+よく目にしていたNullPointerExceptionが発生しなくなると思われます!
+
+#デフォルトで変数に再代入できない
+変数を宣言しただけではその変数に再代入出来ません。
+
+```ceylon
+String s3 = "foo";
+s3 = "bar"; //コンパイルエラー
+````
+
+書き換え可能な変数を宣言するにはvariableを付けて宣言する必要があります。
+
+```ceylon
+variable String s3 = "foo";
+s3 = "bar";
+````
+
+あえて書き換えが可能にする必要があるときだけ
+その変数を宣言するということで意識することが出来ます。
+
+
+#基本的にキャスト禁止(型チェックのスコープが厳密)
+```ceylon
+ value list = ["hoge", 1 , 1.0];
+
+ for (e in list) {
+ if(is String e) {
+ // Stringとしてeを使うことが出来る
+ }
+ if(is Integer e) {
+ // Integerとしてeを使うことが出来る
+ }
+ if(is Float e) {
+ // Floatとしてeを使うことが出来る
+ }
+ }
+````
+
+Javaであればinstanceofなどでチェックした後に
+自前でキャストしていましたが
+Ceylonでは「is 型」でチェックし、その後のスコープでのみ
+その型として扱うことが出来るようになっています。
+スコープを出ると型として使うことが出来ず、
+型固有のメソッドなどを呼び出そうとしてもコンパイルエラーとなります。
+
+この機能によって潜在的なキャストエラーを防ぐことが出来ます。
+
+#まとめ
+
+Javaで暗黙的に行われることで潜在的なエラーとなっていた
+nullやキャストの問題、変数の宣言時の固さなどが改善されて
+細かいけれども重要な部分に気を使われていて、「これ良いな!」って自分は感じました!
+
+それで居ながらJavaとほとんど変わらない感覚で書けるし
+Scalaほどたくさんの機能が入って難しくなってる訳でもない感じがいい感じ。
+Ceylonの良さが光ります。
+
+これを読んで興味出た人は
+JavaをEclipseでやってる人はプラグインを入れればすぐ出来るので
+[開発環境を設定して](http://qiita.com/newta/items/d84200874645fa5cef26) ぜひ触ってみて見てくださいー。