Selfとコロンメソッド
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 43/73。
rect.area(rect)と書いても動作しますが、Lua OOP で以前学んだ、よりよい方法があります。それがcolonです。rect:area()はまったく同じ呼び出しです。Lua は、colon の前にある table を最初の引数であるselfとして自動的に渡します。
colon は定義箇所でも役立ちます。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型の形ではselfをexplicitly宣言していることに注目してください。つまりdeposit: (self: Account, amount: number) -> ()です。実装ではcolonによって隠されているにもかかわらず、です。colonは糖衣構文です。パラメーターはそこに存在し、型ではそれを明示します。何も返さないメソッドは、空の戻り値-> ()を使って型付けします。
呼び出しも、すでに知っている同じルールに従います。account:deposit(250)はaccount.deposit(account, 250)と同一です。OOP の章で扱ったものと同じ実行時の動作であり、Luau はその上に型を追加しているだけです。
チャレンジ
簡単Accountという名前の型エイリアスを作成し、次の要素を含めます。
- 型が
stringのowner - 型が
numberのbalance deposit:(self: Account, amount: number) -> ()getBalance:(self: Account) -> number
ownerが"Maya"、balanceが1500のaccountというtableを作成し、colon定義のsyntax(function account:deposit(amount: number) …)を使って両方のmethodsをアタッチします。depositはamountをbalanceに加算し、getBalanceは現在のbalanceを返します。
colon呼び出しを使用して、次の操作を行います。
- balanceをprintする
250をdepositする- balanceをもう一度printする
- ownerをprintする
自分で試してみよう
-- ここにコードを書いてください
-- 1) 型 Account を定義する(メソッドは型の中で self を明示的に取る)
-- 2) account テーブルを作成し、コロン構文で deposit/getBalance をアタッチする
-- 3) balance を表示し、250 を deposit し、再度 balance を表示し、owner を表示する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ