Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object 在Lua中,如何找到对象存储在其中的键?_Object_Lua_Coronasdk_Lua Table - Fatal编程技术网

Object 在Lua中,如何找到对象存储在其中的键?

Object 在Lua中,如何找到对象存储在其中的键?,object,lua,coronasdk,lua-table,Object,Lua,Coronasdk,Lua Table,如何打印()或查找对象的索引 例如,如果我在屏幕上生成了20个随机岩石对象,并将其放入数组RockTable={} 像这样RockTable[#RockTable+1]=rock 所有的20块石头都显示在屏幕上,我如何通过点击它们来找出每块石头的键或索引 我正在使用Corona SDK 任何帮助都将不胜感激。据我所知,不幸的是你需要粗暴对待桌子。虽然,要知道一个被点击了,你不需要以某种方式循环它们吗;因此已经知道指数了吗 编辑 哦,除非Corona有某种回调事件可以点击。我从来没用过,不过我在L

如何打印()或查找对象的索引

例如,如果我在屏幕上生成了20个随机岩石对象,并将其放入数组
RockTable={}

像这样
RockTable[#RockTable+1]=rock

所有的20块石头都显示在屏幕上,我如何通过点击它们来找出每块石头的键或索引

我正在使用Corona SDK


任何帮助都将不胜感激。

据我所知,不幸的是你需要粗暴对待桌子。虽然,要知道一个被点击了,你不需要以某种方式循环它们吗;因此已经知道指数了吗

编辑

哦,除非Corona有某种回调事件可以点击。我从来没用过,不过我在Lua有经验

你可以做一个反向引用,比如:

Rocks = {a rock, a rockB, a rockC}
RocksB = {[a rock] = 1, [a rockB] = 2, [a rockC] = 3}
然后说rockNum=RocksB[rock]

我很确定这会奏效,但我不能保证,值得一试

编辑2

brute方法看起来有点像:

function getRock(rock)
    for _,v in pairs(rocks) do
        if (v == rock)
            return _
        end
    end
    return "Rock does not exist."
end

您可以这样做,以节省不断循环表以查找索引的麻烦

RockTable = {}
RockIndicies = {}

for i = 1, 20 do
    idx = #RockTable + 1
    RockTable[idx] = rock
    RockIndicies[rock] = idx
end
然后,当你需要知道索引时,你可以使用你必须索引Rockdies的岩石来快速获得它。如果你“删除”了一块石头,你需要确保在两个地方都将其删除。

将表格倒置:

function table_invert(t)
  local u = { }
  for k, v in pairs(t) do u[v] = k end
  return u
end
然后可以使用倒排表查找索引


我发现这个函数非常有用,它进入了我永久的“Lua实用程序”库。

还有另一种方法,使用元方法。 [已编辑以允许您也删除值]

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'])

它更通用,因为您可以复制
t
值并随身携带;这也意味着你大部分时间只需要使用一个变量——希望这能减少你尝试访问错误内容的可能性。

最简单的方法是为每一块岩石添加一个“索引”属性:

RockTable = {}

for i=1,20 do

    local rock
    -- do your thing that generates a new 'rock' object

    rock.index = #RockTable + 1
    RockTable[rock.index] = rock

end
如果使用触控监听器方法,可以通过以下方式检索岩石:

function touchListener( event )
    local rock = event.target
    local rockIndex = rock.index
    -- ...
end
的确,您可以使用索引维护第二个表,但我发现我的方法更干净-当需要删除内容时,您只需担心一个表,即主表


但我有一个问题:为什么需要检索该索引?在大多数情况下,设计良好的事件侦听器函数就足够了,您不需要“查找”对象。当然,我缺乏关于您试图做什么的信息,但有可能您使事情过于复杂。

如本文所述,
Rocks
RocksB
是相同的数组。你想反转
RocksB
中的索引和值,可能是
{[a rock]=1,…
@RBerteig哦,是的;我不敢相信我这么做了。谢谢你指出这一点。