2017-09-09 12 views
1

나는 문제가있다. 전에 n 테이블에있는 알려진 테이블의 값을 변경해야한다. 이 같은 뭔가 :루아가 n 테이블의 테이블 값을 얻는다.

Box = { 
     {Name = "",Box = {{Name = "",Box = {{Name = "", Box = {{Name = "This must be change for the test",Box = {}}}}}}}} 
    } 

이를 변경하려면 내가 이것을 하드 코딩 할 수 있습니다

Box[1].Box[1].Box[1].Box[1].Name = "Changed" 

하지만이 아닌 내가 원하는대로! 이 테이블을 테이블 'n' 주 테이블 'tbl'의 값을 변경할 수있는 하나의 기능을 가질 수 있도록이 동적으로 변경하고 싶습니다.

이렇게 할 방법이 있습니까?

+0

'local t, n = _G, 4; j = 1, n에 대해 t = t.Box [1] end; t.Name = "Changed" ' –

+0

@EgorSkriptunoff, 이것으로 답을 얻을 수 있습니다. 나는 측정했다;) –

+0

@ PaulKulchenko - 단 한 줄 주석에 딱 들어 맞는다! :-) –

답변

0

문제는 디자인 선택을 재고해야 할 것입니다. 이 테이블은 n 개의 테이블에 있으며, box 필드에 자식 노드에 대한 참조가있는 트리 그래프와 유사합니다.

의견에 따르면 해당 트리의 동적 경로에있는 노드를 수정해야합니다. 간단한 함수는 분명합니다 :

그러나 왜 동적 경로를 사용하여 노드를 수정해야하는지에 따라보다 견고한 접근 방법이 필요할 수 있습니다.

local index={} 
local add_new_box = function(name) 
    local box = new_box(name) 
    index[ box.unique_id] = box 
    return box 
end 
: 당신은 예를 들어 당신의 상자가 항상 자신의 ID로 액세스 할 수있는 색인 테이블을 만들 수있는와

local new_box 
do 
local box_count=0 
new_box = function(name) 
    box_count=box_count+1 
    local box = { 
    unique_id=box_count, 
    name=name, 
    box={} 
    } 
    return box 
end 
end 

: 상처 결코 한 가지의 만드는 동안 당신의 상자 고유 식별자의 각을 제공하는 것입니다

또는 허용되지 않는 경우 트리의 노드를 통해 항상 고유 한 값을 가질 수있는 노드를 검색 할 수 있습니다.

하지만 모든 것 : 이미 고유 한 식별자가 있습니다. 주소가 a = {} 일 때 a에 할당되는 값입니다. 그 차이점과 unique_id의 유일한 차이점은 다음과 같습니다. 1) a은 읽기 쉽지 않습니다. 2) a을 아는 경우 검색 할 필요가 없습니다.

그래서, 당신의 문제를 살펴를 살펴보고 자신에게 물어 :? 을 "이 필요하는 이유는 인덱스의 순서 대신 unique_id 얻을 수에서 오는 경우 이유는 box 자체 대신 unique_id 얻을 수없는 이유는 무엇입니까? "