vala の string template と Variant

Console.WriteやConsole.WriteLine と比較して、 stdout.printf は若干面倒なきもするし、 object を用いた box/unbox のサポートが無いことも面倒な気がします。

それらの全面サポートと言うわけではありませんが、GLib.string には、template というものがあり、to_string() メソッドを持つオブジェクトであれば、文字列に直接変数を書く方法があります。方法は文字列を示すダブルクオーテーションで囲み、先頭の " の前に @ を付けて、変数の前に $ を付けるという感じで使います。 str = @"名前は$nameです"; のような感じで使います。stirng template は http://live.gnome.org/Vala/Tutorial#Strings を参照してください。

また、GLib.Variant は様々な型を代入することができます。 Variantについては http://www.valadoc.org/glib-2.0/GLib.Variant.html を参照してください。

ということで、サンプルコードをでっち上げました。

// variant01.vala

class variant01.vala
{
	public static void main ()
	{
		char c = 'c';
		int i = 10;
		double d = 1.1;
		Variant v;

		v = c;
		stdout.printf ("v の型は %s です\n", v.get_type_string());
		c = *(char *) v.get_data();
		stdout.printf (@"char: $c\n");

		v = i;
		stdout.printf ("v の型は %s です\n", v.get_type_string());
		i = *(int*) v.get_data();
		stdout.printf (@"int: $i\n");

		v = d;
		stdout.printf ("v の型は %s です\n", v.get_type_string());
		d = *(double*) v.get_data();
		stdout.printf (@"double: $d\n");

	}
}

実行すると以下のようになります。

$ ./variant01 
v の型は y です
char: c
v の型は i です
int: 10
v の型は d です
double: 1.1000000000000001

string template は to_string() メソッドがある型に限定されるとか、Variant はポインタの概念が必要になるとかありますし、GetTypeではなく、get_type()やget_type_string() で型を知る必要がありますが、それっぽく使えるのではないでしょうか。猫C#本からは離れましたが、vala ではこんなこともできるという紹介でした。