メタテーブル

文字列型の値はデフォルトでメタテーブルが設定されている。また、メタテーブルとして、{__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