URL: http://atnd.org/events/34622
皆さんこんばんは。いかがお過ごしですか?
エンジニア(自称:クラフトマン)のshinriyoです。
多忙な中、こんな素晴らしすぎるのにも程はあるアドベントカレンダーがATNDにあったので参加しました。自作自演乙
Booやって、クリスマスまでにBoo作りましょう。
※ちなみにここでの、Booとは、
【3名】 恋人、愛する人、かわいい人
・免責事項
僕はUnityでBooを使っているため、VisualStudioの.NETで使ってませんし、Unityを前提に記載しているのでご容赦下さい。
一応UnityのMonoDevelopでは普通のコンソールの設定ができますが、設定が面倒なため、
HierarchyのMain Cameraにスクリプトをアタッチするやり方で確認してます。
・前提知識
SledeShareの資料
※Booの基本的な文法は僕の資料が参考になります。
※BooよりUnityScriptが劣ってる点も僕の資料が参考になります。
そもそもの話・・・
C#はでBooを実装、BooでUnityScriptを実装しています。
C#という素晴らしい言語があるのに、わざわざBooなんて作るのは意図があるはずです。
C言語がよりコンピュータに近いので速いのは当たり前ですが、わざわざC言語で実装されたPython、Ruby、PHPが存在してるのは
人間に分かりやすくて、なにより、生産効率ですよね???
Pythonの素晴らしさを取り込んでいます。よって書くのが楽です。
BooはC#より速度は劣るはずですが、簡単にかけますよ。
では、今までBooを使ってみて、C#より便利なことについてを重視して素晴らしいとこを列挙します。
UnityScriptはBooで実装されているのにもかかわらず十分にBooよりわざわざ劣ってて後出しジャンケンで敗北してますし、
すでに資料もあるので省略します。
1. Dictionatyについて
「DictioanaryはHashmapのようにキーと値あるが、中の型も定められる」ものです。
では、値を突っ込んでデバッグログに出すのを書きます。
C#ではこのように書きます。
・DictionaryCS.cs
using UnityEngine; using System.Collections.Generic; public class DictionaryCS : MonoBehaviour { private Dictionary<string, string> dic; void Awake () { dic = new Dictionary<string, string>(); dic["a"] = "hoge"; Debug.Log(dic["a"]); } }
一方Booでは?
→ 短く書けますが、まずC#っぽくめんどくさい書き方はこれ
・DictionaryBoo.boo
import UnityEngine import System.Collections.Generic class DictionaryBoo (MonoBehaviour): private dic as Dictionary[of string, string] def Awake(): dic = Dictionary[of string, string]() dic["a"] = "hoge" Debug.Log(dic["a"])
→ しかし、Booらしく楽に書くには更にこのように短くなります。なんせ{}リテラル使えるし。
・DictionaryBooRemake.boo
import UnityEngine class DictionaryBooRemake (MonoBehaviour): private dic = {} def Awake(): dic["a"] = "hoge" Debug.Log(dic["a"])
System.Collections.Genericをインポートしなくていいし、初期化もしなくていいし楽ですね?!
2.プロパティの書き方
C#では短いです
→ 元々C#は長々とかけていますが、C# 3.0 から短く書けるようになりました。
今確認している私の環境のUnityバージョン3.5でも実行可能でした。
public string Name { get; set; }
Booでは
→ 短く書けるのはこれでしょうか?
[Property(Name)]
private _name as string
1行でも以下↓の形で実行可能でしたが、それでもC#には短さが敵わなかったです。
[Property(Name)] private _name as string
getとsetを分けることもできます。なぜかPropertyと違って"最初小文字"に注意!
getter
[getter(LastName)] private _name as string
setter
[setter(LastName)] private _name as string
3.For文について
for文で0から100を回すのにわざわざiをインクリメントしたりとか書くのが面倒くさいですよね?
Rangeで書きたいものです。
C#では
→ usingするのはしなくてSystem.Collections.Generic;ではなくてSystem.Linq;なんですよね。一応Range使えます。
・LoopCS.cs
using UnityEngine; //using System.Collections.Generic; using System.Linq; public class LoopCS : MonoBehaviour { void Awake () { foreach(int i in Enumerable.Range(1, 100)) { Debug.Log (i); } } }
※かなりだるいですね。
一方Booは!
→ いちいち別のものをimportしなくていいというPythonっぽく電源付属っぷり。かなり短く書けます。
・LoobBoo.boo
import UnityEngine class LoopBoo (MonoBehaviour): def Awake(): for i in range(0,100): Debug.Log(i)
まだまだありますが、ネタがなくなるのでこのへんで。
では、まだ次の方が登録されてません(2012/12/2現在)が、3日目の方お願いします。いなければ僕が書く。