Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Haxe
自己紹介
• @hakurai
• 所属: Backlog開発チーム@Nulab京都/関ジャバ/
hoge駆動/奈良模型愛好会
• よく使う言語: Java/Scala/JavaScript/Haxe/
Objective-C
Haxe
- 静的型付・オブジェクト指向言語
- JavaScript を含む複数言語にコンパイル可能
- 最新バージョンは3.1.3
基本型
- Int(整数値)
- Float(実数)
- Bool(真偽値)
- Dynamic(動的型)
- Void(値ではない値)
型パラメータ
var array = new Array<String>();
!
array.push("hoge");
array.push(123) // コンパイルエラー
String型の配列
Int型
動的型(Dynamic)
- 型チェックが行われない型
- 基本的に使わない方がいい
- 静的片付けのメリットが失われる
動的型(Dynamic)
var value:Dynamic = test ;
!
value = 123; //OK
String型
Int型Dynamic型
構造体(匿名オブジェクト)
var point = { x : 1, y : -5 }; // 型 {x:Int, y:Int}
!
typedef Point = {x:Int, y:Int} // Point 型を宣言
var point:Point = { x : 1, y : -5 };
構造的部分型
typedef Point = { x : Int, y : Int }
typedef Point3D = { x : Int, y : Int, z : Int }
!
var p3d:Point3D = { x : 0, y : 0, z : 0 };
var pt:Point = p3d; // OK
関数型
var func = function(a:String, b:String):String{
return a + b;
};
型 は String -> String -> String
enum(列挙型)
enum Color{
Red;
Green;
Blue;
}
enum(列挙型)
- パラメータを与えることもできる
enum ConstantPoolInfo {
Empty;
Utf8Info(body:String);
IntegerInfo(body:Int);
FloatInfo(body:Float);
}
クラス宣言
class Todo {
public var summary(default, default):String;
public function new(summary:String) {
this.summary = summary;
}
public function hoge():String {
return hoge ;
}
}
プロパティ
コンストラクタ
メソッド
クラス宣言 - プロパティ
public var summary(default, default):String
プロパティ - アクセスコントロール
public var summary(default, default):String
!
public - どこからでもアクセス可能
private - 自クラスとサブクラスからアクセス可能
プロパティ - アクセッサー
public var summary(default, default):String
!
default - 読み込み、書き込み可能
null - クラス内部から読み込み、書き込み可能
get / set - getter / setter を自分で定義
never - どこからもアクセス不可
dynamic - getter / setter を動的に設定
クラス宣言 - コンストラクタ
public function new(summary:String, done:Bool)
- new という名前の関数がコンストラクタ
- オーバーロード不可
- オプション引数を使う
ローカル変数宣言
var hoge:String = "hoge";
var fuga = fuga";
!
fuga = 123; //型が違うのでコンパイルエラー
型推論でString型に
Int型String型
Module System
package todo;
import knockout.Knockout;
import knockout.Observable;
class Todo {
for ループ
for( i in 0...10 ) {
// ...
}
!
- この書き方はできない
for(i = 0; i < 10;i ++){
}
if 式
- if 式は値を返す
var value = if(flag) {
100;
}else{
200;
}
JavaScriptの場合
var value;
if(flag) {
value = 100;
}else{
value = 200;
}
switch
var value = switch(flag){
case 0: java";
case 1: scala ;
case 2: groovy ;
default: other ;
}
パターンマッチ - enum
enum Info {
Empty;
Text(data:String);
}
function test(info: Info):String {
return switch(info){
case Empty: empty ;
case Text(data): data;
}
パラメータ
パターンマッチ - 構造体
var value = { lang: java , ver: 8};
var text = switch(value){
case {lang: java , ver:8}: latest ;
case {lang: java , ver:v} if (v > 8): error ;
case {lang: java , ver:v} : Std.string(v);
case _: other ;
}
パターンマッチ - ガード
var value = { lang: java , ver: 8};
var text = switch(value){
case {lang: java , ver:8}: latest ;
case {lang: java , ver:v} if (v > 8): error ;
case {lang: java , ver:v} : Std.string(v);
case _: other ;
}
ガード
String Interpolation(文字列補完)
文字列中に変数や式の値を埋め込める
シングルクォーテーション限定
!
var name = "Haxe";
var x = 10;
var text = '$name is ${x*2} times better than X';
// "Haxe is 20 times better than X"
オプション引数
function foo( x:Int, ?y:Int, z:String="hello" ) {
trace(x + "," + y + "," + z);
}
- デフォルト値を指定
- 省略可能な引数(デフォルト値 null)
using
- 既存のクラスを外から拡張する
- Objective-C のカテゴリみたいなの
- Lambda クラス(Iterable を拡張)
Lambda - filter
var nums = [1, 3, 5, 6, 7, 8];
var res =
nums.filter(function(n) { return n < 5;});
!
trace(res); // [6, 7, 8]
Lambda
var nums = [1, 3, 5, 6, 7, 8];
var res = nums.map(function(n) {return n * 2;});
trace(res); // [2, 6, 10, 12, 14, 16]
この他にも・・・
- 例外
- inline
- リフレクション
- マクロ
- Interface
- Abstract 型
- Implicit cast
- 演算子オーバーロード
など
外部JavaScriptとの連携
- 型定義ファイル(extern class)を定義する
- jQueryなどはライブラリが公開されている
もしくは
- Dynamic型を利用する
- 最終手段
Haxelib
- 依存性解決ツール
- 公式リポジトリ http://lib.haxe.org
- gitリポジトリから直接ダウンロードなども可能
- haxelib.json を置いておく
IDE
• IntelliJ IDEA(Haxe plugin)
• FDT(Eclipseベース)
• FlashDevelop(Windows)
Haxe 利用事例
Backlog
課題詳細 / 課題をまとめて操作(Haxe & knockout.js )
ありがとうございました

More Related Content

Haxe