形状へのメソッドの追加
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 44/80。
LuaのOOPの章で学んだように、テーブルにはほかの値と同じように関数を格納できます。型はそうした関数フィールドも記述でき、型をデータと振る舞いの小さな契約にできます。
メソッドのフィールドには、関数の章で学んだ関数型の構文を使います。最初のパラメーターには慣例的にselfという名前を付けます。これはメソッドが属するテーブルを指し、型は自分自身を参照することもできます。
type Greeter = {
name: string,
greet: (self: Greeter) -> string,
}この型を実装するには、フィールドに関数を格納し、selfパラメーターを受け取るようにします。
local greeter: Greeter = {
name = "Ana",
greet = function(self: Greeter): string
return `Hello, I'm {self.name}`
end,
}これを呼び出すには、自分でテーブルをselfとして渡します。つまり、greeter.greet(greeter)です。selfを通じて、メソッドは呼び出されたテーブルのフィールドを読み取ります。
テーブルを二度書くのは面倒に感じますが、Luaには解決策があることをすでに知っています。コロンです。次のレッスンでは、:構文とこうした型との関係を学びます。
チャレンジ
簡単長方形の図形に、面積を計算するメソッドを持たせましょう。
type Rectangle = {width: number, height: number, area: (self: Rectangle) -> number}と書きます。- 幅が
4、高さが6で、area = function(self: Rectangle): numberがself.width * self.heightを返すlocal rect: Rectangleを作成します。 rect.area(rect)、続いてrect.widthを出力します。
Run Codeを押すと、出力に24と4が表示されます。
自分で試してみよう
-- 1) width、height、area メソッドを持つ Rectangle 型
-- 2) area を実装したローカル変数 rect: Rectangle(width 4、height 6)
-- 3) area を出力し、次に width を出力する
Luau入門のすべてのレッスン
自分で練習してみよう: Luauオンラインコンパイラ