差分
このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| odin:procedures [2025/05/20 12:15] – 作成 freemikan | odin:procedures [2025/06/13 10:03] (現在) – [プロシージャ] Set link to odin top page for logo image freemikan | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| ====== プロシージャ ====== | ====== プロシージャ ====== | ||
| + | [[odin: | ||
| + | |||
| 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 | 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 | ||
| - | プロシージャは、手続きという意味です。 | + | プロシージャとは手続きという意味です。 |
| 別の言語では、サブルーチン、関数、メソッドなど、異なる呼び名がつけられています。 | 別の言語では、サブルーチン、関数、メソッドなど、異なる呼び名がつけられています。 | ||
| - | Pascal言語などのように、値を返すかどうかによって、関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 | + | Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 |
| + | ===== 基本 ===== | ||
| すでにひとつプロシージャが登場しています。 | すでにひとつプロシージャが登場しています。 | ||
| mainプロシージャです。 | mainプロシージャです。 | ||
| 行 14: | 行 18: | ||
| </ | </ | ||
| - | mainプロシージャは、プログラムの開始地点となる特別なプロシージャです。 | + | mainプロシージャはプログラムの開始地点となる特別なプロシージャです。 |
| - | このmainプロシージャは、引数を取らず、戻り値がありません。 | + | このmainプロシージャは引数を取らず戻り値がありません。 |
| - | 自分のプロシージャを書くときは、自由に名前をつけて、パラメーターと戻り値を設定することができます。 | + | 自分のプロシージャを書くときは、自由に名前をつけてパラメーターと戻り値を設定することができます。 |
| 次の例は、パラメーターが一つのプロシージャです。 | 次の例は、パラメーターが一つのプロシージャです。 | ||
| 行 39: | 行 43: | ||
| '' | '' | ||
| + | ===== 名前付き戻り値 ===== | ||
| 戻り値に名前をつけることができます。 | 戻り値に名前をつけることができます。 | ||
| 行 47: | 行 52: | ||
| </ | </ | ||
| - | 複数の値を返すことができます。 | + | ===== 複数の値を返す ===== |
| + | プロシージャは複数の値を返すことができます。 | ||
| <code odin> | <code odin> | ||
| 行 60: | 行 66: | ||
| </ | </ | ||
| + | ===== 名前付き引数 ===== | ||
| 引数を名前で渡すことができます。 | 引数を名前で渡すことができます。 | ||
| 行 79: | 行 86: | ||
| </ | </ | ||
| + | ===== パラメーターのデフォルト値 ===== | ||
| + | パラメーターのデフォルト値を設定することができます。 | ||
| + | <code odin> | ||
| + | Rect :: struct { | ||
| + | x, y: int, | ||
| + | width, height: int, | ||
| + | } | ||
| + | |||
| + | make_square :: proc(x, y: int, size := 100) -> Rect { | ||
| + | // sizeのデフォルト値を100とします。 | ||
| + | // 100という数値に特に意味はありません。 | ||
| + | |||
| + | return Rect{x = x, y = y, width = size, height = size} | ||
| + | } | ||
| + | |||
| + | main :: proc() { | ||
| + | r := make_square(10, | ||
| + | assert(r.x == 10 && r.y == 20 && r.width == 100 && r.height == 100) | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== オーバーロード ===== | ||
| + | プロシージャのオーバーロード、すなわちパラメーターが異なる同じ名前のプロシージャを複数定義することが可能です。 | ||
| + | ただし、C++などのように、単に同じ名前のプロシージャを定義すれば良いだけではなく、明示的にオーバーロードすることを記述しなければなりません。 | ||
| + | 1ステップ追加の作業が必要になります。 | ||
| + | |||
| + | <code odin> | ||
| + | Vector2i :: struct { | ||
| + | x, y: int | ||
| + | } | ||
| + | |||
| + | Vector3i :: struct { | ||
| + | x, y, z: int | ||
| + | } | ||
| + | |||
| + | dot2 :: proc(a, b: Vector2i) -> int { | ||
| + | return a.x * b.x + a.y * b.y | ||
| + | } | ||
| + | |||
| + | dot3 :: proc(a, b: Vector3i) -> int { | ||
| + | return a.x * b.x + a.y * b.y + a.z * b.z | ||
| + | } | ||
| + | |||
| + | // 明示的なプロシージャのオーバーロード | ||
| + | dot :: proc{dot2, dot3} | ||
| + | |||
| + | main :: proc() { | ||
| + | a := Vector2i{x = 1, y = 1} | ||
| + | b := Vector2i{x = 10, y = 10} | ||
| + | assert(dot(a, | ||
| + | |||
| + | c := Vector3i{x = 1, y = 1, z = 1} | ||
| + | d := Vector3i{x = 10, y = 20, z = 30} | ||
| + | assert(dot(c, | ||
| + | } | ||
| + | </ | ||
