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 })endfunction User:certify() -- certifyメソッドの定義for i, user in ipairs(users) doif user.name == self.name thenif user["password"] == self.password thenreturn trueelsereturn falseendendendreturn falseend john = User.new("john", "xxxxx") -- Userのインスタンスを作成する。 paul = User.new("paul", "yyy____") -- Userのインスタンスを作成する。if john:certify() then-- メソッドの呼び出しprint("johnは認証された。")elseprint("johnは認証されなかった。")endif paul:certify() thenprint("paulは認証された。")elseprint("paulは認証されなかった。")end
Userクラスのコンストラクタとして、User.newという関数を定義しています。
Userクラスのcertifyメソッドとして、User:certifyというメソッドを定義しています。
メソッド内では、selfという変数でインスタンスにアクセスできます。
コンストラクタは、User.new だけど、メソッドは、john:certify。. と : が間違えやすい。
これで、一応オブジェクト指向っぽい書き方ができるようになりました。
頑張って継承とかを行なう方法もあるらしいですが、Luaの良さを活かすためには、あまりオブジェクト指向にこだわらないほうが良さそうです。