Lua勉強日記(5)
2008/05/23
今度は、インスタンスを作成して使うクラスとして、Userクラスを書いてみました。certifyメソッドは、Userクラスのメソッドとして実装してみます。
その前に、javaなどとは勝手が違うので、メソッドの定義方法です。
コロン 構文を使って メソッド を定義できる。メソッドとは、暗黙の引数 self を余分に持つ関数である。つまり、以下の構文
function t.a.b.c:f (…) … end
は、以下の文のシンタックスシュガーである。
t.a.b.c.f = function (self, …) … end
Lua 5.1 リファレンスマニュアル
oop.lua
users = { { name = "john", password = "xxxxx"}, { name = "paul", password = "yyyyy"} } User = {} -- クラスの定義 function User.new(name, password) -- コンストラクタの定義 self = { name = name, password = password } return setmetatable(self, { __index = User }) end function User:certify() -- certifyメソッドの定義 for i, user in ipairs(users) do if user.name == self.name then if user["password"] == self.password then return true else return false end end end return false end john = User.new("john", "xxxxx") -- Userのインスタンスを作成する。 paul = User.new("paul", "yyy____") -- Userのインスタンスを作成する。 if john:certify() then -- メソッドの呼び出し print("johnは認証された。") else print("johnは認証されなかった。") end if paul:certify() then print("paulは認証された。") else print("paulは認証されなかった。") end
Userクラスのコンストラクタとして、User.newという関数を定義しています。
Userクラスのcertifyメソッドとして、User:certifyというメソッドを定義しています。
メソッド内では、selfという変数でインスタンスにアクセスできます。
コンストラクタは、User.new だけど、メソッドは、john:certify。. と : が間違えやすい。
これで、一応オブジェクト指向っぽい書き方ができるようになりました。
頑張って継承とかを行なう方法もあるらしいですが、Luaの良さを活かすためには、あまりオブジェクト指向にこだわらないほうが良さそうです。