M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

JavaプログラマーからみたVala(2) 型

原典は、“Vala for Java Programmers”(2011年3月13日取得)です。

******************************

基本型

  • 標準的な型(intやlongなど)のサイズはアーキテクチャに依存します。こうした型のサイズを求めるには、sizeof()を使用します。例えば、sizeof(int)といった具合です。
  • Valaで追加された型──int8、int16、int32、int64(すべて符号あり)、uint8、uint16、uint32、uint64(すべて符号なし)は、アーキテクチャ非依存であることが保証されています。
  • byte型はありません。(代わりにuint8を使用しましょう。)
  • Javaにおけるboolean型は、Valaではbool型です。
  • Valaで追加された基本型には、unichar型があります。これはユニコード文字をあらわします。

定数修飾子は、finalではなくconstです。

Vala言語では基本型もメソッドを持ちます。例えば以下のように──

int a = -4.abs ();
string s = a.to_string ();
int b = int.max (5, 7); // int型の静的メソッドが呼ばれています。

文字列型

Javaの場合:
型名は、Stringです。
意味的等価性をチェックするにはequals(String)メソッドを使用します。

Valaの場合:
型名はstringです。(小文字です。)
意味的等価性をチェックするには==演算子を使用します。

Valaでは文字列の(==演算子による)比較は、内容ベースで行われます。参照ベースではありません。<、>、<=、>=などの比較演算子は、文字列の辞書的比較に使用できます。文字列はswitch文で使用できます。

Vala文字列はUTF-8で保持されます。

Vala言語における文字列のその他の特徴

Vala言語は逐語的文字列リテラル(verbatim strings)をサポートしています。逐語的文字列リテラルは、3連ダブルクオテーションで囲います("""...""")。

string verbatim = """Verbatim strings don't evaluate escape sequences
like \n, \t, ... and may span multiple lines. The line breaks are part
of the string. You can use quotation marks (") and backslashes (\)
inside a verbatim string without escaping them."""

Vala言語は文字列テンプレートをサポートしています。@"..."で囲われた文字列は、$記号を接頭辞にした式をその内容に含むことができます。

string name = "John";
stdout.printf (@"Welcome, $name!");
stdout.printf (@"3 + 2 = $(3 + 2)");

配列

動的な成長

Vala言語では、配列に対して+=演算子を用いて、動的に要素を追加していくことができます。配列は2のべき乗のサイズで(動的に)メモリー上に再配置されます。

int[] squares = {};
for (int i = 0; i < 100; i++) {
    squares += i * i;
}
境界はチェックしない

Vala言語では、いかなる場合にも、実行環境により配列の境界がチェックされることはありません。

int[] a = new int[10];
a[20] = 1;  // 危険なコード!

(Valaの将来のバージョンでは、任意の境界チェック機能を実装することが検討されています。)

多次元の配列

Javaの場合: ジャグ配列を使用できます。(。配列の配列です。)

int[][] matrix = new int[3][];
for (int[] row : matrix) {
    row = new int[4];
}

Valaの場合: 長方形配列を使用できます。(rectangular multi-dimensional arrays。 [,]、 [,,]。Javaにおける多次元配列は配列オブジェクトに対する参照を要素とする配列ですが、Valaにおけるそれは多次元配列そのものが1つの連続したメモリーブロックに配置されます。)Valaでも、ジャグ配列のサポートが予定されています。

int[,] matrix = new int[3,4];

型推論

Vala言語では、ローカル変数に関して、型推論(暗黙型決定)と呼ばれるメカニズムが適用されます。このメカニズムの下では、──変数の初期化の際の式からコンパイラが型を推論できる場合──ローカル変数は型名ではなくvarキーワードによって宣言できます。これにより、不要な冗長性(意訳:ソースコードの可読性に対してメリットにならない冗長性)が取り除かれ、ジェネリック型の使用が簡単になります。例えば以下のように──

var obj = new Object ();
var map = new HashMap<string, int> ();
var str = "hello, world";
var arr = new int[10];

これに対して型推論メカニズムがないと以下のようになります──

Object obj = new Object ();
HashMap<string, int> map = new HashMap<string, int> ();
string str = "hello, world";
int[] arr = new int[10];

もちろん、すべての変数は静的型システムの管理下にあります(Still, everything is statically typed。意訳:動的型システムとはちがいます)。

foreach文

Javaの場合:

for (int i : numbers) { }

Valaの場合:

foreach (int i in numbers) { }


******************************

JavaプログラマーからみたVala (3)につづく──