vala の ref と out

「猫C#」の第8章はクラスとメソッドの紹介ですが、再帰呼び出しは vala でも行えるので、ref と out を調べてみる。swap01.vala も swap02.vala も値渡しなので、本と同じ結果になる。

// swap01.vala

class myclass
{
	private int temp;


	public void swap (int x, int y)
	{
		temp = x;
		x = y;
		y = temp;
	}
}

class swap01
{
	public static void main ()
	{
		myclass s = new myclass ();
		int x = 10, y = 20;
		s.swap (x, y);
		stdout.printf (@"x = $x, y = $y\n");
	}
}
// swap02.vala

class myclass
{
	private string temp;

	public void swap (string str1, string str2)
	{
		temp = str1;
		str1 = str2;
		str2 = temp;
		stdout.printf (@"swap: str1 = $str1, str2 = $str2\n");
	}
}

class swap02
{
	public static void main ()
	{
		string str1 = "犬", str2 = "猫";
		myclass s = new myclass ();
		s.swap (str1, str2);
		stdout.printf (@"main: str1 = $str1, str2 = $str2\n");
	}
}

今回は、単純に string template を使ってみたかっただけです。ref を使って swap01.vala を書き換えると、きちんと参照渡しになります。

// swap03.vala

class myclass
{
	private int temp;


	public void swap (ref int x, ref int y)
	{
		temp = x;
		x = y;
		y = temp;
	}
}

class swap03
{
	public static void main ()
	{
		myclass s = new myclass ();
		int x = 10, y = 20;
		s.swap (ref x, ref y);
		stdout.printf (@"x = $x, y = $y\n");
	}
}

out を使うのは、結果を書き込む場合みたいです。

// outkeyword01.vala

class MyClass
{
	public void Square (double x, double y, out double s)
	{
		s = x * y;
	}
}

class outkeyword01
{
	public static void main ()
	{
		double a = 125.3, b = 16.25, c;
		MyClass mc = new MyClass ();

		// c には値を代入していません
		mc.Square (a, b, out c);

		stdout.printf (@"縦 $a m、横 $b mの長方形の面積は$c平方メートル\n");
	}
}

string template を使う場合は、変数の前後に半角空白が必要みたいですね。

さて、これらの ref と out って、ポインタで十分という気分にもなりますが、C#では型調査などを実行するので、ポインタより安心です。

今日はここまでです。