8

テーブルタイプにメソッドを追加するにはどうすればよいですか?テーブルの値を検索するメソッドを作成しようとしています。これまでのところ私は持っています。

function table:contains(value)
  for _, v in ipairs(self) do
    if v == value then return true end
  end
  return false
end

しかし、私が次のことをしようとすると。

t = {'four', 'five', 'six'}
t:contains('five')

エラーが発生します。

stdin:1: attempt to call method 'contains' (a nil value)

助言がありますか?

4

3 に答える 3

8

他の人が言ったように、あなたは単純なテーブルであり、t次のキーと値のペアのみが含まれています:[1]='four'、、。[2]='five'[3]='six'

tモジュールから関数にアクセスできるようにを「拡張」する場合は、モジュールを指すようにtableメタテーブルを設定する必要があります。簡単にアクセスするには、次の関数を使用します。__indextable

function T(t)
    return setmetatable(t, {__index = table})
end

その後、次のように使用できます(括弧が不要なシンタックスシュガーのおかげで):

t = T{'four', 'five', 'six'}
t:insert('seven')
print(t:contains('seven')) --> true
于 2012-05-28T07:02:14.827 に答える
7

すべてのテーブルに単一のメタテーブルはありません。文字列や数値とは異なり、各テーブルには独自のメタテーブルがあります。

このようなもののために、「メンバー」関数の代わりに無料の関数を作成するだけです。すべてがすべてOOPである必要はありません:

于 2012-05-28T03:38:37.623 に答える
3

ライブラリにメソッドを追加しましたtableが、テーブルにメタテーブルを指定していませんttableとの間には自動接続はありませんt

于 2012-05-28T03:38:53.807 に答える