Menu
CoddyTech

Selfとコロンメソッド

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 45/80。

rect.area(rect)と書いても動きますが、Lua OOPですでに学んだもっとよい方法があります。コロンです。rect:area()もまったく同じ呼び出しです。Luaはコロンの前にあるテーブルを最初の引数selfとして自動的に渡します。

コロンは定義する場所でも役立ちます。function account:deposit(amount)と宣言すると、名前がselfの隠れた最初のパラメーターが自動的に用意されます。

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Maya", balance = 1500}

function account:deposit(amount: number)
    self.balance += amount -- self は暗黙的に渡される
end

function account:getBalance(): number
    return self.balance
end

型の形ではdeposit: (self: Account, amount: number) -> ()のように、selfを明示的に宣言していることに注目してください。実装ではコロンによって隠されているにもかかわらず、宣言されています。コロンは糖衣構文です。パラメーターは実際に存在し、型にも明記されています。何も返さないメソッドは、戻り値に空の-> ()を指定して型付けします。

呼び出しも、すでに知っているのと同じルールに従います。account:deposit(250)はaccount.deposit(account, 250)と同じです。OOPの章で学んだのと同じ実行時の動作で、Luauはその上に型を追加するだけです。

account自体には型注釈が付いていないことに注目してください。Account型は完成したテーブルを表し、両方のメソッドが追加されて初めて、そのテーブルは型に一致します。そのため、local account: Account = {owner = "Maya", balance = 1500}とすると、strictモードではメソッドが不足していると報告されます。

challenge icon

チャレンジ

簡単

コロン構文を使って、アカウントに2つのメソッドを追加します。

  1. テーブルの下に、function account:deposit(amount: number)を定義し、amountをself.balanceに加算します。
  2. function account:getBalance(): numberを定義し、self.balanceを返します。
  3. account:getBalance()を出力し、account:deposit(120)を呼び出してから、もう一度account:getBalance()を出力します。

Run Codeを押します。出力には、まず300、次に420が表示されます。

自分で試してみよう

type Account = {
    owner: string,
    balance: number,
    deposit: (self: Account, amount: number) -> (),
    getBalance: (self: Account) -> number,
}

local account = {owner = "Noah", balance = 300}

-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) 残高を表示し、120 を預け入れ、もう一度残高を表示する

Luau入門のすべてのレッスン

自分で練習してみよう: Luauオンラインコンパイラ