Haxe入門 / Basic Types
言語リファレンスを読んでいく。まとめない方が読み進めるの速いけどブログネタがなくて継続が途切れるという事情。
2.1 Basic Types 基本型
基本型は
- Bool (論理型)
- Float (浮動小数点型)
- Int (整数型)
Basic Typesはabstract typesであるとか書いてある。abstract typesは読んでないので知らないけど、コンパイル時にプラットフォーム固有の型に置き換えられる?らしい。
2.1.1 Numeric types 数値型
FloatとIntの2つ。Floatは(おそらくIEEE754の)64bitに準拠。IntはFloatに変換できる。でもFloatからIntへの変換は丸め誤差とかあるし、暗黙的変換はできない。試してみる
var a:Float = 3.0; var b:Int; b = a;
Float shoukd be Int
というエラーがでた。なるほど。
2.1.2 Overflow
パフォーマンス落ちるので、オーバーフローのチェックはしない。挙動はターゲットの言語によって異なる。例えばC++,Java,C#とかだと普通の32bit符号付き整数な扱いだし、PHPとかJavascriptだとInt型なんてなくてfloatが上限となる(252)
32bit整数、64bit整数を明示的に使いたい場合はhaxe.Int32, haxe.Int64がある。これを利用した場合のコストは言語依存。
2.1.3 Numeric Operators 数値型の演算
算術演算
数値型に対してよくある演算は定義されてる。
++, --, +, -, *, /, %
インクリメント(++)/デクリメント(--)はInt、Float両方に使える。
四則演算(+.-,*,/)、剰余(%)も定義されてる。剰余にもFloat使えるらしい。へー。
IntとFloatとの演算は、Floatで返されるらしい。多くの他言語と同じですね。
比較演算
比較演算子もよくある定義。
==, !=, <, <=, >, >=
が使えます。返り値はBool型。
ビット演算
ビット演算はIntに対してのみ
~, &, |, ^, <<, >>, >>>
順に、ビット反転, and, or, xor, 左シフト、右シフト、論理右シフト
2.1.4 Bool 論理型
値
論理型がとる値は2つ。trueかfalse
演算
&&, ||, !
でand, or, notが使える。
A && B
に対してはAが先に評価され、Aがtrueの場合のみBも評価される。Aがfalseの場合、Bは評価されない(つまりBに到達しない)。なぜこういう挙動かというと、AがfalseならばBを評価するまでもなく、A&&BはfalseなのでBを評価する意味が無い。
A || B
に対しても同じ。AがtrueならばBを評価しても無駄なので、Bは評価されない。
このような挙動であるため、
if(object != null && object.field == 1) { ... }
という書き方ができる。objectがnullのとき、object.fieldにアクセスしようとするとランタイムエラーとなる。でもobject!=nullでチェックしておけば、object.fieldへのアクセスは起こらないのでランタイムエラーは起きない。
2.1.5 Void
Voidは特殊な型で、実際には型ではない。型というよりも、型がないことを示したいときに使う。主に関数の引数や返り値で使われる。
class HelloWorld { static public function main():Void { trace("Hello World"); } }
このmain関数はまさにその例で、形式的にはVoid型の引数をとってVoid型の返り値を返す。実際にはVoidなので、引数をとらないし、返り値もない。Void型の変数というものはない。
var x:Void;
とVoid型の変数を定義しようとすると
Arguments and variables of type Void are not allowed
というコンパイルエラーになる。
以上Basic typesでした。