差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
odin:procedures [2025/05/20 12:16] – freemikan | odin:procedures [2025/06/13 10:03] (現在) – [プロシージャ] Set link to odin top page for logo image freemikan | ||
---|---|---|---|
行 1: | 行 1: | ||
====== プロシージャ ====== | ====== プロシージャ ====== | ||
+ | [[odin: | ||
+ | |||
何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 | 何かの仕事を行うプログラムの一部分をまとめて、繰り返し利用できるようにしたり、コードの構造を整理したりするために、プロシージャを用います。 | ||
プロシージャとは手続きという意味です。 | プロシージャとは手続きという意味です。 | ||
行 5: | 行 7: | ||
Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 | Pascal言語などのように、値を返すかどうかによって関数とプロシージャに呼び分けれている場合もありますが、Odinではどちらもプロシージャと呼びます。 | ||
+ | |||
+ | ===== 基本 ===== | ||
すでにひとつプロシージャが登場しています。 | すでにひとつプロシージャが登場しています。 | ||
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, | ||
+ | } | ||
+ | </ | ||