metamethodsを使用して別の方法で行うことができます。 はあなたがt
値をコピーして、あなたとそれを取ることができるとして、それは、より汎用性の高いです
t = {} -- Create your table, can be called anything
t.r_index = {} -- Holds the number value, i.e. t[1] = 'Foo'
t.r_table = {} -- Holds the string value, i.e. t['Foo'] = 1
mt = {} -- Create the metatable
mt.__newindex = function (self, key, value) -- For creating the new indexes
if value == nil then -- If you're trying to delete an entry then
if tonumber(key) then -- Check if you are giving a numerical index
local i_value = self.r_index[key] -- get the corrosponding string index
self.r_index[key] = nil -- Delete
self.r_table[i_value] = nil
else -- Otherwise do the same as above, but for a given string index
local t_value = self.r_table[key]
self.r_index[t_value] = nil
self.r_table[key] = nil
end
else
table.insert(self.r_index, tonumber(key), value) -- For t[1] = 'Foo'
self.r_table[value] = key -- For t['Foo'] = 1
end
end
mt.__index = function (self, key) -- Gives you the values back when you index them
if tonumber(key) then
return (self.r_index[key]) -- For For t[1] = 'Foo'
else
return (self.r_table[key]) -- For t['Foo'] = 1
end
end
setmetatable(t, mt) -- Creates the metatable
t[1] = "Rock1" -- Set the values
t[2] = "Rock2"
print(t[1], t[2]) -- And *should* proove that it works
print(t['Rock1'], t['Rock2'])
t[1] = nil
print(t[1], t[2]) -- And *should* proove that it works
print(t['Rock1'], t['Rock2'])
[あなたはあまりにも値を削除できるようにするために編集されました]。ほとんどの場合、1つの変数で遊ぶだけで済むことを意味します。うまくいけば、間違ったことにアクセスしようとする可能性を減らすことができます。
ここで書いたように、 'Rocks'と' RocksB'は同じ配列です。あなたは 'RocksB'のインデックスと値を' {[a rock] = 1、... 'として逆転させたいと思っていました。 – RBerteig
@RBerteig Oh yeah;私はそれを信じられません。それを指摘してくれてありがとう。 –