*Luaリファレンス 要注意点 ~オブジェクト指向~ [#kee16b7e] **インボカント ~暗黙の第1引数self~ [#ja94c102] --PerlやPythonでは、明記必須のインボカント。Luaにも存在します。~ インボカントこそ、手続き型言語をオブジェクト指向化する中核概念といえるでしょう。 ~ #sh(lua){{ Account = { balance = 0 } function Account.withdraw (v) Account,balance = Account.balance - v end }} これはテーブル内にメソッド的なものを定義した例ですが、これだと #sh(lua){{ a = Account Account = nil a.withdraw(10) ---> エラー }} となってしまいます。 そこで、インボカントが登場する function Account.withdraw ( self, v ) self.balance = self.balance - v end 多くの言語では、1番目のself(またはthisとなっている言語も多い)の引数は見えなくなっている。 これはシンタックスシュガーで実現しているものだ。 function Account:withdraw( v ) ---> 「.」ではなく、「:」を使うと、1番目の引数にselfが自動的に付加されたこととみなされる。 self.balance = self.balance - v end 呼び出しも「:」を使えば第1引数にオブジェクト自体を代入したことと同じとなる。通常記法も使えるがその場合はやや間が抜けた記述となるだろう。 a = Account, Account = nil a.withdraw(a, 10) --> 通常記法 a:withdraw(10) --> シンタックスシュガー。第1引数にオブジェクト自身をインボカントとして渡す形となる。