Menu
CoddyTech

形状へのメソッドの追加

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には解決策があることをすでに知っています。コロンです。次のレッスンでは、:構文とこうした型との関係を学びます。

challenge icon

チャレンジ

簡単

長方形の図形に、面積を計算するメソッドを持たせましょう。

  1. type Rectangle = {width: number, height: number, area: (self: Rectangle) -> number}と書きます。
  2. 幅が4、高さが6で、area = function(self: Rectangle): numberがself.width * self.heightを返すlocal rect: Rectangleを作成します。
  3. 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オンラインコンパイラ