HaxeTips の変更点


[[FrontPage]]


* Tips [#c86af2b8]
HaxeのTipを紹介するページです

----
#contents
----

** 文字列 [#d0ca35d6]
*** 文字列内の変数展開 [#taa19ced]
シングルクォートの文字列内で「${xxx}」を使うと文字列内で変数を展開することができます。
#geshi(Actionscript3){{
  var str = "hoge";
  trace('My name is ${str}');
}}


*** 文字列内の特定の文字を別の文字に置き換えたい [#d569a1ce]
StringTools.replaceを使用すると文字列を置き換えられます。
#geshi(ActionScript3){{
  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("元の文字", "置き換える文字", "置き換えた後の文字") となります

**正規表現 [#z0020f14]
*** 正規表現で文字列を置き換えたい [#n33f91e6]
例えば以下の用に記述すると、0と1以外を0に置き換えます。
#geshi(Actionscript3){{
    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")
}}

*** 正規表現を動的に生成したい [#l1434cdc]
ERegクラスを使うと文字列で指定が可能となります
#geshi(ActionScript3){{
  // 第一引数に正規表現の文字列、第二引数に正規表現のオプションを指定する
  var regex1 = new EReg("^.+", "i");    // -> ~/^.+/i
  // オプションを指定したくない時は、第二引数は空の文字列を指定する
  var regex2 = new EReg("^.+", "");     // -> ~/^.+/  
}}

- 参考:[[Haxeで正規表現を動的に生成する>http://qiita.com/k-motoyan/items/315f1194b83c6e88d075]]


** 変換・キャスト [#zadd8322]
*** 型をキャストしたい [#y36680ec]
castキーワードでキャストできます。
#geshi(Actionscript3){{
  var num = 1.23;
  // Int型にキャスト
  var num2 = cast(num, Int);
}}

左辺値の型が決まっていればcastの引数は省略可能です。
#geshi(Actionscript3){{
  var num = 1.23;
  // 左辺値に型の指定があれば省略可能
  var num2:Int = cast num;
}}

*** 文字列を数値に変換する [#yb5d4de3]
Std.parseIntで整数値に変換できます。
#geshi(Actionscript3){{
  var str = "123";
  var num = Std.parseInt(str);
  if(num == null) {
    // 数値に変換できない場合、Std.parseIntの戻り値はnull
    trace('numは数値ではありません');
  }
}}

*** 浮動小数を整数に変換する [#e26ca825]
Std.intで変換をします
#geshi(Actionscript3){{
  // 「3」と出力されます
  trace(Std.int(3.14));
}}

*** 数値を0埋めした文字にしたい [#uadfeaad]
#geshi(ActionScript){{
  /**
     * 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);
  }
}}

*** 数値をスペース埋めした文字列にしたい [#ca2197d4]
#geshi(ActionScript){{
  /**
     * スペース埋めした数値文字列を返す
     * @param	n
     * @param	digit
     * @return
     */

  public static function fillSpace(n:Int, digit:Int):String {
    var str:String = "" + n;
    return StringTools.lpad(str, " ", digit);
  }
}}

*** 秒を「時:分:秒」の形式の文字列にしたい [#z341f8bf]

#geshi(ActionScript){{
  /**
   * 秒を「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);
  }
}}

** 文法・制御 [#meff5857]
*** 一定回数処理を繰りかえす [#h758049d]
以下のコードは10回ループします。
#geshi(Actionscript3){{
  for(i in 0...10) {
    trace(i);
  }
}}

*** 関数の引数を省略したい [#xbaabfc8]
コールバック関数を定義する際など、引数の定義が必要だけれども、それを使わない場合は「_」で省略できます。

#geshi(ActionScript3){{
// ■引数をちゃんと書く場合
new FlxTimer().start(1, function(timer:FlxTimer) {
  // 何か処理をする
});
}}


#geshi(ActionScript3){{
// ■引数を省略
new FlxTimer().start(1, function(_) {
  // 何か処理をする
});
}}

少しだけ短く書くことができます。

*** 関数のバインディングについて [#kd7fdd60]
関数のバインディングを使うとコードを短く書くことができます。
例えば、選択メニュー用のボタンとして作成したFlxButtonのコールバック関数の指定です。

#geshi(Actionscript3){{
/**
 * 選択肢の決定
 */
function resolveChoice(choice:Int):Void {
  switch(choice) {
    case 0:
      // ゲーム開始
      FlxG.switchState(new PlayState());
    case 1:
      // ゲーム終了
      System.exit(0);
  }
}
}}

この関数を、FlxButtonに登録します。

#geshi(Actionscript3){{
// スタートボタンの作成
var _buttonStart = new FlxButton(0, 0, "START", function() {
  // 1番目を選んだ
  resolveChoice(0);
});
// 終了ボタンの作成
var _buttonExit = new FlxButton(0, 0, "EXIT", function() {
var _buttonExit = new FlxButton(0, 32, "EXIT", function() {
  // 2番目を選んだ
  resolveChoice(1);
});
}}

普通に書くとこのようになります。ですが関数のバインディングを使うと、少し短く書けます。

#geshi(Actionscript3){{
// スタートボタンの作成
var _buttonStart = new FlxButton(0, 0, "START", resolveChoice.bind(0));
// 終了ボタンの作成
var _buttonExit = new FlxButton(0, 0, "EXIT", resolveChoice.bind(1));
}}

このように関数のバインディングを使うと、引数を省略した関数オブジェクトを作ることができます。

- 参考:[[Qiita - 部分適用で、関数の持つ引数を減らす>http://qiita.com/shohei909/items/f858fa1341ed54396b61]]
** アルゴリズム [#vb85a243]
*** ソートを実装したい [#b8b44bc9]
数値配列であれば、Array.sortが使えます。
#geshi(Actionscript3){{
  var array:Array<Int> = [3, 5, 2, 4, 1];
  array.sort(
      function(a:Int, b:Int):Int {
          return a - b; // 昇順ソート
      }
  );
}}

オブジェクト配列の場合は、ArraySortを使います。
#geshi(Actionscript3){{
import haxe.ds.ArraySort;

function sort() {
  var _itemList:Array<ItemData>;
  ArraySort.sort(_itemList, function(a:ItemData, b:ItemData) {
    // ソートキーを比較
    return a.sortkey - b.sortkey; // 昇順ソート
  });
}
}}

** データ構造 [#i39b3a97]
*** キューを実装したい [#xbc223cd]
List.add()  で末尾に要素を追加、List.pop() で先頭から要素を取り出すことができます。
Array.push() で末尾に追加して、Array.shift() で先頭から取り出す方法もありますが、Listの方がメモリ消費が少なく済みます。

** 環境 [#y801e414]
*** Flash環境でDynamicオブジェクトをcastすると止まる [#j08f0b26]
Flash環境ではDynamicオブジェクトをClassにcastすると、それ以降が実行されなくなるようです。そのためFlash環境で動かす場合は、castではなく、1つ1つのフィールドを取り出す必要があります。

#geshi(Actionscript3){{
  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;
}}