Lua勉強日記(5)

今度は、インスタンスを作成して使うクラスとして、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の良さを活かすためには、あまりオブジェクト指向にこだわらないほうが良さそうです。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください