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モードではメソッドが不足していると報告されます。
チャレンジ
簡単コロン構文を使って、アカウントに2つのメソッドを追加します。
- テーブルの下に、
function account:deposit(amount: number)を定義し、amountをself.balanceに加算します。 function account:getBalance(): numberを定義し、self.balanceを返します。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オンラインコンパイラ