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#では型調査などを実行するので、ポインタより安心です。
今日はここまでです。