2012-03-17 1 views
3

개체의 색인을 인쇄()하거나 찾으려면 어떻게해야합니까? 예를 들어루아에서는 객체가 저장된 키를 어떻게 발견 할 수 있습니까?

, 내가 발견 할 방법이 RockTable[#RockTable + 1] = rock;

그리고 20 개 개의 바위처럼 RockTable = {};

가 화면에 표시됩니다 배열로 화면에 20 개 임의 바위 객체를 양산 경우 어떻게 키 또는 인덱스 각각의 바위 그들을 클릭하여?

저는 Corona SDK를 사용하고 있습니다.

도움을 주시면 감사하겠습니다.

답변

0

불행히도 내 지식으로는 테이블을 쓸데없이 쓸 필요가 있습니다. 클릭 한 사실을 알기 위해 어쨌든 어떤 식 으로든 반복 할 필요는 없습니다. 따라서 이미 색인을 알고 있습니까?

편집

아, 코로나 클릭에 대한 콜백 이벤트의 일종을 가지고 있지 않는. 나는 그것을 사용한 적이 없으며, 루아에서 경험이있다.

당신은 어쩌면 그렇게처럼 뒤로 참조를 할 수있는 :

Rocks = {a rock, a rockB, a rockC} 
RocksB = {[a rock] = 1, [a rockB] = 2, [a rockC] = 3} 

을 그럼 그냥 말을 rockNum = RocksB [바위]

나는 일을해야 꽤 확신하지만 난 그것을 보장 할 수 없습니다 가치가있는 시도.

Edit2가

짐승 방법은 다소 같을 것이다 :이 인덱스를 찾기 위해 당신에게 지속적으로 테이블을 통해 반복의 몇 가지 문제를 저장할

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

여기에 쓰여진 것처럼'Rocks'와'RocksB'는 동일한 배열입니다. 'RocksB'에서 인덱스와 값을 역전 시키길 원했을 것입니다. 아마도 {{a rock = 1, ...}이라고 생각했을 것입니다. – RBerteig

+0

@RBerteig 오, 예; 내가 그걸 믿을 수 없어. 그것을 지적 주셔서 감사합니다. –

1

당신이 뭔가를 할 수 ...

RockTable = {} 
RockIndicies = {} 

for i = 1, 20 do 
    idx = #RockTable + 1 
    RockTable[idx] = rock 
    RockIndicies[rock] = idx 
end 

색인을 알고 싶으면 RockIndices를 색인화하여 신속하게 가져올 수 있습니다. 바위를 '삭제'하는 경우 두 곳에서 바위를 제거해야합니다.

4

반전 테이블이 :

function table_invert(t) 
    local u = { } 
    for k, v in pairs(t) do u[v] = k end 
    return u 
end 

그런 다음 인덱스를 찾기 위해 반전 테이블을 사용할 수 있습니다.

이 기능이 너무 유용하여 내 영구 "Lua 유틸리티"라이브러리에 포함됩니다.

2

metamethods를 사용하여 할 수있는 또 다른 방법이 있습니다. 는 [당신이 값을 제거 할 수 있도록 편집도]

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 값을 복사하고 당신과 함께 걸릴 수있는 더 다양한입니다; 그것은 또한 대부분의 시간 변수 중 하나만 가지고 놀아야 만한다는 것을 의미합니다. 잘못된 일에 액세스하려는 가능성을 줄여야합니다.

function touchListener(event) 
    local rock = event.target 
    local rockIndex = rock.index 
    -- ... 
end 

그것을 : 당신이 터치 리스너 방법을 사용하는 경우

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 

, 당신은 바위 이런 식으로 검색 할 수 있습니다

2

가장 간단한 방법은 각각의 바위에 "인덱스"속성을 추가하는 것입니다 인덱스가있는 두 번째 테이블을 유지할 수 있다는 것이 맞지만 메서드를보다 깨끗하게 찾을 수 있습니다. 일을 제거 할 시간이되면 주요 테이블 하나만 걱정하면됩니다.

나는 질문이 있습니다. 왜 그 색인을 검색해야합니까? 대부분의 경우 잘 설계된 이벤트 리스너 함수로 충분하므로 객체를 "찾을"필요가 없습니다. 물론 당신이하려는 일에 대한 정보가 부족하지만, 당신이 지나치게 복잡한 일들이 가능할 수도 있습니다.