今回は、よく見かける object.method1() と object:method1() の違いを調べたので、それについてまとめたいと思います。
luaではメソッドの呼び出したに「.」と「:」の2つを用いるのですが どのように使い分けるかというと 「:」を使うと自分自身をメソッドに渡すことができる。 ということです。 これだけじゃ、なんのこっちゃということになるので解説していきます。 まず、Luaではクラスが存在しないので、クラスっぽいことをするためにテーブルというものを使います。 luaでのテーブルは配列の添え字に数字以外も使えるような、配列の進化版って感じでいいと思います。 あとは各要素に入るオブジェクトの型が異なっていてもおっけーです。 なので、同じテーブル内に関数型を持ったり変数(たとえば整数型)を持ったりもできるというわけです。 ようはこのテーブルを使ってクラスっぽいことしちゃおうぜってことです。 c言語で無理やりにクラスを実現させようとして、構造体使ってやるみたいなもんですかね 戻りますが、このテーブルを使うやり方にも問題があって テーブル内の要素は、自分のいるテーブルの他の要素にはアクセスできないということです。 このため、メソッドに対してテーブル自身を引数として渡す必要が出てきます。 それが以下の例です。
local addTable = {
na = 1,
nb = 2,
add = function(this)
return this.na + this.nb
end
diff_na = function(this, n)
return this.na - n
end
}
addTabel.add(addTable)
addTabel.diff_na(addTable, 1)
addTabel:add()
addTabel:diff_na(1)
このように4行目や7行目のメソッドで自分のテーブルを引数としています。
このように、「.」での呼び出しでは自身を引数として与えていますが
「:」での呼び出しでは指定せずに勝手に与えてくれるという特徴があります。