メタテーブル
文字列型の値はデフォルトでメタテーブルが設定されている。また、メタテーブルとして、{__index=string}が設定されているので、stringに関数を追加すれば、それが文字列のメソッドとなる。
> print(getmetatable(1)) --数値にはメタテーブルが設定されていない nil > print(getmetatable({})) --テーブルにはメタテーブルが設定されていない nil > print(getmetatable('')) --文字列にはメタテーブルが設定されている table: 003C9228 > m = getmetatable('') > for k,v in pairs(m) do print(k,v) end __index table: 003C8E38 > for k,v in pairs(m.__index) do io.write(k..' ') end; print() --メソッドの一覧表示 sub foo upper len gfind rep find match char dump gmatch reverse byte format gsub lower > print(('abc'):len()) --メソッド呼び出し 3 > function string.foo(self) --メソッドを追加 >> return self..99 >> end > print(('abc'):foo()) --追加したメソッドを呼び出し abc99 > for k,v in pairs(table) do io.write(k..' ') end; print() --tableの関数を一覧表示 setn insert getn foreachi maxn foreach concat sort remove > t = {1,2,3} > print(t:getn()) --getnというキーが見つからないためエラー stdin:1: attempt to call method 'getn' (a nil value) stack traceback: stdin:1: in main chunk [C]: ? > setmetatable(t, {__index=table}) --メタテーブルを設定 > print(t:getn()) --getnが見つかる 3