키없이 참조 될 때 테이블이 자신에 대한 참조가 아닌 특정 값을 반환 할 수 있습니까?루아 테이블의 반환 값을 재정의 할 수 있습니까?
의 나는 다음과 같은 테이블이 있다고 가정 해 봅시다 :
local person = {
name = "Kapulani",
level = 100,
age = 30,
}
루아, 나는 아주 쉽게 "person.name", "person.level"또는 "인 person.age"를 참조하여 값을 얻을 수 있습니다 예상대로 그러나 필자는 "person"을 참조하고 "table :"대신 "person.name"값을 반환하고 싶을 수도 있습니다.
즉, person.x (또는 person [x])가 테이블에서 적절한 항목을 반환하지만 키가없는 사람이 person.name (또는 person [ "name "]). 내가 찾을 수 없었던이 메커니즘이 있습니까?
__index는 키가 존재하지 않는 경우에만 적용되므로 메타 테이블에서는 성공하지 못했습니다. 내가 별도의 테이블에 "사람"을 넣으면, 내가 가지고 올 수 :
이) (__index에서, 나에게 할 뚜렷한 방법이 없다 제외하고 나, 특별한 처리를 할 __index 사용할 수 있습니다local true_person = {
... -- as above
}
local env_mt = {
__index = function(t, k)
if k == 'person' then
return true_person
end
end
}
local env = setmetatable({}, env_mt)
, env.person에 대한 요청 (true_person.name을 반환 할 곳) 또는 env.person [key] (true_person을 테이블로 반환하려는 경우 'key'를 적절히 액세스).
의견이 있으십니까? 나는 다르게 접근 할 수 있지만, 나는이 선을 따라 접근 할 수 있기를 희망한다.
당신은 자신의 DSL을 만들기 위해 루아의 구문과 싸우고 있습니다. 정말로 이점이 있습니까? 예가 도움이 될 것입니다. 어쨌든 __call 메타 메소드를 사용해 보거나 간단하게 : default() 메소드를 일반 또는 테이블 특정 구현과 함께 모든 테이블에 추가 할 수 있습니다. –
나는 장단점을 분명히 고려하고있다. 나는 ** __ call **을 가지고 놀았으며, **() **에 대한 필요성을 피하기를 희망했지만, 내가 찾고있는 것에 조금 더 가깝습니다.내가 바라는 장점은 기존 구문과 루아 구문 사이의 '번역'양을 제한함으로써 루아가 오류를 던지면 출력이 상대적으로 의미 있고 사용자에게 인식 될 수 있다는 것입니다. 따라서 ** 및 **을 ** 및 ** 및 **으로 ** 또는 **을 ** 또는 **로 변환하는 것은 이상하지는 않지만 ** 사람 **에서 ** 사람()으로 변환 ** ** person.name **에 번역이 필요하지 않은 장소는 조금 이상 할 수 있습니다. – Kapulani