*Luaリファレンス 要注意点 ~オブジェクト指向~ [#kee16b7e]

**インボカント ~暗黙の第1引数self~ [#ja94c102]

--PerlやPythonでは、明記必須のインボカント。Luaにも存在します。~
-PerlやPythonでは、明記必須のインボカント。Luaにも存在します。~
インボカントこそ、手続き型言語をオブジェクト指向化する中核概念といえるでしょう。
~
#sh(lua){{
Account = { balance = 0 }
function Account.withdraw (v)
    Account,balance = Account.balance - v
end
}}
これはテーブル内にメソッド的なものを定義した例ですが、これだと
#sh(lua){{
#sh(lua;highlight:[2]){{
a = Account
Account = nil
a.withdraw(10)  ---> エラー
}}
となってしまいます。

 そこで、インボカントが登場する
 
  function Account.withdraw ( self, v )
      self.balance = self.balance - v
  end
-そこで、第1引数とインボカントが活躍します。
#sh(lua){{
function Account.withdraw ( self, v )
    self.balance = self.balance - v
end
}}

   多くの言語では、1番目のself(またはthisとなっている言語も多い)の引数は見えなくなっている。
  これはシンタックスシュガーで実現しているものだ。
-多くの言語では、1番目のself(またはthisとなっている言語も多い)の引数は見えなくなっています。
#sh(lua;highlight:[1]){{
function Account:withdraw( v )    ---> 「.」ではなく、「:」を使うと、1番目の引数にselfを書いたことと同じこととみなされる。
    self.balance = self.balance - v
end
}}

 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引数にオブジェクト自身を渡していることになる。

}}

 呼び出しも「:」を使えば第1引数にオブジェクト自体を代入したことと同じとなる。通常記法も使えるがその場合はやや間が抜けた記述となるだろう。

 a = Account, Account = nil
  a.withdraw(a, 10)  --> 通常記法
 a:withdraw(10)     -->  シンタックスシュガー。第1引数にオブジェクト自身をインボカントとして渡す形となる。


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS