クライアント(ブラウザ)もサーバも同一言語で書ける haXe を使ってみる(2) - 基本的な文法
どうも、あかさたです。前回は、Flash、JavaScript、NekoVM で動作するバイトコードを出力する Java ライクなオブジェクト指向言語 haXe をサーバ上で動かしてみました。今回は haXe の基本的な文法を紹介します。
haXe の基本的な文法
haXe は Java や ActionScript3 に近い文法を持っている(特に ActionScript3 に近い)ので、これらの言語に慣れている人であれば簡単に入っていけるでしょう。これから、基本的な文法について説明します。
クラスの定義
まずはクラスの定義を紹介します。(haXe のオブジェクト指向プログラミングの詳細については後ほど紹介します。)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 |
class MyClass {
var id : Int;
static var name : String = "";
function myMethod() : Void {
// 一行コメント
/*
複数行のコメント
*/
}
function hoge() : Int {
return 10;
}
static function main() {
// static なメソッド
}
}
|
まず、1 行目では、クラス「MyClass」を宣言しています。2 行目では、整数(Int)型のフィールド(メンバ変数)を宣言しています。文字列型(String)のクラス変数(スタティック変数)を宣言しています。初期値に空文字を設定しています。
4 行目では戻り値のないメソッドを宣言しています。戻り型の Void は省略することもできます。5 行目は一行コメント、6 ~ 8 行目は複数行にわたるコメントの書き方です。
11 ~ 13 行目では整数型の戻り値を持つメソッドを定義しています。return で値を返しています。15 ~ 17 行目では、スタティックなメソッド(クラスメソッド)を宣言しています。
次に、コンストラクタとインスタンス生成について紹介します。クラス名と同じ名前のメソッドを定義するとコンストラクタとなる言語が多いのですが、haXe では new で定義することに注意してください。以下、コンストラクタの定義とインスタンスの生成の例です。
class MyClass {
function new() {
// ここに初期化を記述
}
}
// インスタンスの生成は new 演算子を使う var s = new MyClass();
基本的な型を紹介します。haXe に登場する基本的な型は、整数型(Int)、実数型(Float)、ブール型(Bool)、ダイナミック型(Dynamic)が存在します。ダイナミック型の変数は、コンパイラによる型チェックが行われません。以下、ダイナミック型の例です。
var hoge : Dynamic = ""; hoge = 15; hoge = true; hoge.myMethod(); // undefined が返される。
上記の例で登場する「myMethod」メソッドは定義されていないので、undefined が返されます。
制御構文と基本的な演算子
次に、if, switch, for, while, break, continue の基本的な制御構文を見てみましょう。(余談ですが、haXe ではこれらの制御構文は式として定義されています。この辺のマニアックな文法については、次回以降紹介したいと考えています。)
まずは if 文です。以下のような書き方で if ~ else if ~ else を記述することができます。
if (hoge == 15) {
// 処理
}
else if (hoge == 16) {
// 処理
}
else {
// 処理
}
// このような書き方も可能
if (hoge == 15)
// 処理
else
// 処理
次は switch 文です。
switch(hoge) {
case 0:
// 処理
case 1:
// 処理
default:
// 処理
}
上記の記述は以下と等価です。
if (hoge == 0) {
// 処理
}
else if (hoge == 1) {
// 処理
}
else {
// 処理
}
次は for, while, break, continue のループ構文です。for 文ではループカウンタの変数を定義する必要はありません。for 文は C 系の言語と少し異なります。以下の例における「a.length」が「a.length-1」でないことに注意してください。
var a = [0, 1, 2];
for(i in 0...a.length) {
// 処理
trace(a[i]);
}
var i = 0;
var length = 10;
while(i < length) {
if (hoge) {
break;
}
else {
continue;
}
i++;
}
break はループを終了し、continue は処理を終了して次のイテレーションの実行を開始します。
haXe で使用できる演算子については、言語リファレンスの演算子の項目を参照してください。
haXe のオブジェクト指向プログラミング
haXe はオブジェクト指向プログラミング言語です。ここでは、一般的な継承、プロパティの定義について紹介します。
以下、クラスの定義、インタフェースの定義、継承と実装です。インタフェースはインスタンスを生成することができないクラスです。デフォルトでは、定義したメンバは全て public になります。extends で継承、implements で実装するインタフェースを定義することができます。
// クラス定義
class MySuperClass {
}
// インタフェースの定義
interface MyInterface {
}
// 継承と実装
class MyClass extends MySuperClass, implements MyInterface {
}
最後に、C#、Delphi ではおなじみの機能ですが、プロパティの定義について説明します。
通常、フィールドにアクセスする場合、variable.getHoge() のようにアクセッサを介します。フィールドの値を取得する場合はともかく、variable.hoge に直接値の代入を許可すると、予期せぬ副作用があるかもしれないからです。
とはいえ、「variable.setHoge(10);」と書くよりも、「variable.hoge = 10;」と書く方がその一行が何をしているのか理解しやすいことも事実です。このような書き方をしつつフィールドへの安全な代入を実現する機構がプロパティというわけです。
class MyClass {
public var hoge(getHoge, setHoge) : Int;
private var m_hoge : Int;
private function getHoge() {
return m_hoge;
}
private function setHoge( v : Int ) {
m_hoge = v;
return m_hoge;
}
}
上記のように定義してやることで、「variable.hoge = 10;」と書くと、「variable.setHoge(10);」と書くことと同じ意味になります。プロパティはソースコードの理解容易性を向上するためのテクニックと言えます。
以上、haXe のオブジェクト指向でした。ほぼ既存のオブジェクト指向プログラミング言語の知識をそのまま使えることがわかると思います。多重継承(のようなもの、厳密には違う)もあるので、次回の記事ではもう少し掘り下げたいと思います。
まとめ
haXe の文法は何かしらオブジェクト指向プログラミング言語をやったことのある人にとってはなじみやすいものだったのではないでしょうか。JavaScript しか触ったことがない人だと、型に関する考え方が少し難しいかもしれません。その場合は、Java や ActionScript3 などを勉強してからだと理解が早まるでしょう。
本連載でも次回以降の記事でもう少し掘り下げる予定ですが、さらに詳しく文法を知りたい方は、公式サイトの言語リファレンスを参照するとよいでしょう。それでは!
TrackBack URL :
