2016-06-14 2 views
0

루아에서 변수로 정의 된 테이블을 색인하는 방법이 있습니까? 예 :변수를 기반으로 특정 테이블을 인덱싱 하시겠습니까?

function checkTable(t, k) 
    return t[k] 
end 

checkTable(coffee, 1) 

모든 테이블의 키 값을 반환합니다.

그러나 테이블 "커피"가 아니라 테이블 "t"의 항목 1을 반환합니다. 이 함수는 "t"를 변수로 인식하지 않고 대신 리터럴 테이블 "t"를 찾습니다. 어떻게해야합니까?

+0

아니요, 코드가 정상적으로 작동하는 것 같습니다. 'local coffee = {4, 5, 6} print (checkTable (coffee, 1))'커피의 색인을 잘 얻는다. –

+0

무엇? 함수 범위의 변수 "t"는 둘러싼 범위의 변수 "coffee"와 동일한 값을 갖습니다. 문제가 무엇입니까? – BadZen

+0

정확한 동작/출력을 게시하여 그 의미가 "함수가 변수를 t으로 인식하지 못합니다"라고 생각하게하십시오. – BadZen

답변

1

가 (5.2에서 소개 된) 환경에 대한 5.3 reference의 §2.2 참조 :

으로는 §3.2 및 §3.3.3에서 논의 될 것이다, 무료 이름에 대한 참조 (즉, 선언에 바인드되지 않은 이름) ​​var은 구문 적으로 _ENV.var로 변환됩니다. 게다가 모든 청크는 _ENV (§3.3.2 참조)라는 외부 로컬 변수의 범위에서 컴파일되므로 _ENV 자체는 결코 청크에서 자유 이름이 아닙니다. 당신이 그것을에 전달하거나하지 않는

function checkTable(t, k) 
    local tbl = _ENV[t] 

    if tbl ~= nil then 
     return tbl[k] 
    else 
     return nil 
    end 
end 

그러나이 기능은 발신자의 환경에 액세스 할 수 없습니다, 또는 당신은 그것을 정의 : 같은

그래서 함수의 적절한 구현 보일 것이다 다른 함수 (클로저) 내에 있으므로, _ENV에 위쪽 값으로 액세스합니다.


또한 모든 전역을 포함하는 지구 환경은 글로벌 붙박이 변수 _G 있습니다.

+0

'_ENV'는 루아 5.2에서 소개되었습니다. – lhf

+0

질문에서 묻는 것처럼 테이블을 참조로 전달/액세스하려면 반드시 _ENV에 액세스 할 필요가 없습니다. (사실, _ENV [t]는 OP가 요구하는 것을하지 않습니다. 이름으로't' 문자열을 찾아 결과에 액세스합니다.) – BadZen

+0

@BadZen이 경우 OP를 놓친 것입니다. 필자가 이해할 수있는 한, 그는 임의의 문자열을 찾을 수 있도록'foo [bar] '라고하는 프로그래밍 방식을 요구하고있다. 그렇지 않으면 그가 게시 한 코드가 이미 맞으므로 의문이 들지 않습니다. –

관련 문제