HaxeTips
Tips
HaxeのTipを紹介するページです
文字列
文字列内の変数展開
シングルクォートの文字列内で「${xxx}」を使うと文字列内で変数を展開することができます。
var str = "hoge"; trace('My name is ${str}');
文字列内の特定の文字を別の文字に置き換えたい
StringTools?.replaceを使用すると文字列を置き換えられます。
var str1 = "2,5,6,2,8"; // "2"をすべて"0"に置き換える var str2 = StringTools.replace(str1, "2", "0"); // "0,5,6,0,8" と出力される trace(str2);
StringTools?.replaceの引数の説明は、replace("元の文字", "置き換える文字", "置き換えた後の文字") となります
正規表現
正規表現で文字列を置き換えたい
例えば以下の用に記述すると、0と1以外を0に置き換えます。
var text = "0,1,2,3,5,7,11,13"; var r = ~/([\d]{2,}|[2-9])/g; // 0と1以外は置き換える text = r.replace(text, "0"); // 0に置き換える (=> "0,1,0,0,0,0,0,0")
正規表現を動的に生成したい
ERegクラスを使うと文字列で指定が可能となります
// 第一引数に正規表現の文字列、第二引数に正規表現のオプションを指定する var regex1 = new EReg("^.+", "i"); // -> ~/^.+/i // オプションを指定したくない時は、第二引数は空の文字列を指定する var regex2 = new EReg("^.+", ""); // -> ~/^.+/
変換・キャスト
型をキャストしたい
castキーワードでキャストできます。
var num = 1.23; // Int型にキャスト var num2 = cast(num, Int);
左辺値の型が決まっていればcastの引数は省略可能です。
var num = 1.23; // 左辺値に型の指定があれば省略可能 var num2:Int = cast num;
文字列を数値に変換する
Std.parseIntで整数値に変換できます。
var str = "123"; var num = Std.parseInt(str); if(num == null) { // 数値に変換できない場合、Std.parseIntの戻り値はnull trace('numは数値ではありません'); }
浮動小数を整数に変換する
Std.intで変換をします
// 「3」と出力されます trace(Std.int(3.14));
数値を0埋めした文字にしたい
/** * 0埋めした数値文字列を返す * @param n 元の数値 * @param digit ゼロ埋めする桁数 * @return ゼロ埋めした文字列 */ public static function fillZero(n:Int, digit:Int):String { var str:String = "" + n; return StringTools.lpad(str, "0", digit); }
数値をスペース埋めした文字列にしたい
/** * スペース埋めした数値文字列を返す * @param n * @param digit * @return */ public static function fillSpace(n:Int, digit:Int):String { var str:String = "" + n; return StringTools.lpad(str, " ", digit); }
秒を「時:分:秒」の形式の文字列にしたい
/** * 秒を「HH:MM:SS」形式の文字列に変換して返す **/ public static function secToHHMMSS(sec:Int):String { var hour = Std.int(sec / 60 / 60); var minute = Std.int(sec / 60); var second = sec % 60; return fillZero(hour, 2) + ":" + fillZero(minute, 2) + ":" + fillZero(second, 2); }
文法・制御
一定回数処理を繰りかえす
以下のコードは10回ループします。
for(i in 0...10) { trace(i); }
関数の引数を省略したい
コールバック関数を定義する際など、引数の定義が必要だけれども、それを使わない場合は「_」で省略できます。
// ■引数をちゃんと書く場合 new FlxTimer().start(1, function(timer:FlxTimer) { // 何か処理をする });
// ■引数を省略 new FlxTimer().start(1, function(_) { // 何か処理をする });
少しだけ短く書くことができます。
関数のバインディングについて
関数のバインディングを使うとコードを短く書くことができます。 例えば、選択メニュー用のボタンとして作成したFlxButtonのコールバック関数の指定です。
/** * 選択肢の決定 */ function resolveChoice(choice:Int):Void { switch(choice) { case 0: // ゲーム開始 FlxG.switchState(new PlayState()); case 1: // ゲーム終了 System.exit(0); } }
この関数を、FlxButtonに登録します。
// スタートボタンの作成 var _buttonStart = new FlxButton(0, 0, "START", function() { // 1番目を選んだ resolveChoice(0); }); // 終了ボタンの作成 var _buttonExit = new FlxButton(0, 32, "EXIT", function() { // 2番目を選んだ resolveChoice(1); });
普通に書くとこのようになります。ですが関数のバインディングを使うと、少し短く書けます。
// スタートボタンの作成 var _buttonStart = new FlxButton(0, 0, "START", resolveChoice.bind(0)); // 終了ボタンの作成 var _buttonExit = new FlxButton(0, 0, "EXIT", resolveChoice.bind(1));
このように関数のバインディングを使うと、引数を省略した関数オブジェクトを作ることができます。
アルゴリズム
ソートを実装したい
数値配列であれば、Array.sortが使えます。
var array:Array<Int> = [3, 5, 2, 4, 1]; array.sort( function(a:Int, b:Int):Int { return a - b; // 昇順ソート } );
オブジェクト配列の場合は、ArraySort?を使います。
import haxe.ds.ArraySort; function sort() { var _itemList:Array<ItemData>; ArraySort.sort(_itemList, function(a:ItemData, b:ItemData) { // ソートキーを比較 return a.sortkey - b.sortkey; // 昇順ソート }); }
データ構造
キューを実装したい
List.add() で末尾に要素を追加、List.pop() で先頭から要素を取り出すことができます。 Array.push() で末尾に追加して、Array.shift() で先頭から取り出す方法もありますが、Listの方がメモリ消費が少なく済みます。
環境
Flash環境でDynamicオブジェクトをcastすると止まる
Flash環境ではDynamicオブジェクトをClassにcastすると、それ以降が実行されなくなるようです。そのためFlash環境で動かす場合は、castではなく、1つ1つのフィールドを取り出す必要があります。
class MyClass { public var score; } …… var obj = Json.parse('{"score":100}'); // Flash環境では動かない //var myclass = cast(obj, MyClass); // このようにする必要がある var myclass = new MyClass(); myclass.score = obj.score;