HaxeTips

FrontPage

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;