メタテーブルとは?
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 16/54。
メタテーブルは単なる通常のLuaテーブルですが、特別な目的を持っています。メタテーブルを別のテーブル(ここでは「メイン」テーブルと呼びましょう)にアタッチすると、そのメインテーブルに対して特定の操作が行われたときの振る舞いを変更することができます。
このように考えてみてください:通常、+ 演算子を使って2つのテーブルを加算しようとすると、Luaはどうすればよいかわからず、エラーを返します。しかし、メタテーブルを使えば、テーブルにとっての加算が何を意味するのかを定義できます。対応する値を加算したり、内容を連結したり、プログラムにとって意味のある他の処理を行わせたりすることができます。
メタテーブルは、メタメソッドと呼ばれる特殊な関数を定義することで機能します。これらのメタメソッドには、加算のための __add や、存在しないキーを検索するための __index のように、2つのアンダースコアで始まる特定の名前があります。Luaがメタテーブルを持つテーブルに対して操作を行う際、メタテーブルに対応するメタメソッドがあるかどうかを確認し、それを使用して何が起こるべきかを決定します。
この概念は、独自の振る舞いを持つカスタムデータ型の作成、オブジェクト指向パターンの実装、意図しない変更からのテーブルの保護など、さまざまな可能性を広げます。今後のレッスンでは、テーブルにメタテーブルをアタッチし、メタメソッドを使用してその振る舞いをカスタマイズする方法を学びます。
チートシート
メタテーブルは、特定の操作に対する動作を変更するために、別のテーブルにアタッチできる通常のLuaテーブルです。
メタテーブルは、名前が2つのアンダースコアで始まる、メタメソッドと呼ばれる特殊な関数を使用します:
__add- 加算の動作を定義します__index- 存在しないキーを検索する際の動作を定義します
メタテーブルを持つテーブルに対して操作が行われると、Luaは対応するメタメソッドを確認し、それを使用して動作を決定します。
メタテーブルによって以下が可能になります:
- 特定の動作を持つカスタムデータ型の作成
- オブジェクト指向パターンの実装
- 不要な変更からのテーブルの保護
自分で試してみよう
このレッスンにはコードチャレンジは含まれていません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。