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 })
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の良さを活かすためには、あまりオブジェクト指向にこだわらないほうが良さそうです。

コメントする

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


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

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