*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;highlight:[2]){{ a = Account Account = nil a.withdraw(10) ---> エラー }} となってしまいます。 -そこで、第1引数とインボカントが活躍します。 #sh(lua){{ function Account.withdraw ( self, v ) self.balance = self.balance - v end }} -多くの言語では、1番目のself(またはthisとなっている言語も多い)の引数は見えなくなっています。 #sh(lua;highlight:[1]){{ function Account:withdraw( v ) ---> 「.」ではなく、「:」を使うと、1番目の引数にselfを書いたことと同じこととみなされる。 self.balance = self.balance - v end }} -呼び出しも「:」を使えば第1引数にオブジェクト自体を代入したことと同じとなる。~ 通常記法も使えるがその場合はやや間が抜けた記述となるだろう。~ #sh(lua;highlight:[4]){{ a = Account Account = nil a.withdraw(a, 10) --> 通常記法。第1引数にテーブル(オブジェクト)自身を渡す。 a:withdraw(10) --> シンタックスシュガー。第1引数にオブジェクト自身を渡していることになる。 }}