文書の過去の版を表示しています。


プロシージャ

何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 プロシージャは、手続きという意味です。 別の言語では、サブルーチン、関数、メソッドなど、異なる呼び名がつけられています。 Pascal言語などのように、値を返すかどうかによって、関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。

すでにひとつプロシージャが登場しています。 mainプロシージャです。

main :: proc() {
	// ...
}

mainプロシージャは、プログラムの開始地点となる特別なプロシージャです。

このmainプロシージャは、引数を取らず、戻り値がありません。 自分のプロシージャを書くときは、自由に名前をつけて、パラメーターと戻り値を設定することができます。

次の例は、パラメーターが一つのプロシージャです。

greet :: proc(name: string) {
	fmt.println("Hello, ", name, "!")
}

次の例は、パラメーターが2つで戻り値があるプロシージャです。

add :: proc(a, b: int) -> int {
	return a + b
}

連続するパラメーターの型が同一ならば、まとめて指定できる点に注目してください。 上の例では、a、bと続いて両方ともintなので、bの後ろにintとだけ指定するだけでOKです。 (a: int, b: int) とすることもできますが、通常はまとめてしまった方が良いでしょう。

戻り値に名前をつけることができます。

add :: proc(a, b: int) -> (result: int) {
	result = a + b
}

複数の値を返すことができます。

translated :: proc(x, y: int, dx, dy: int) -> (int, int) {
	return x + dx, y + dy
}

main :: proc() {
	x, y := translated(100, 200, 10, 20)
	assert(x == 110 && y == 220)
}

引数を名前で渡すことができます。

greet :: proc(message, name: string) {
	fmt.println(message, name)
}

main :: proc() {
	greet("Hello", name = "Monkey")
}

名前引数はすべての位置引数より後ろで指定しなければなりません。 次の呼び出しはコンパイルされません。

greet(name = "Monkey", "Hello")  // コンパイルエラー!

文書の編集
文書の先頭へ