2017-09-19 13 views
1

코드의 위치가 변경되지 않는 다음과 같은 시나리오가 있습니다. 이 코드를 수정하여 함수 및 테이블 변수를 이동하지 않고 오류를 수정하는 방법 나는 단지 4 일간 루아 초보자입니다함수가 나중에 선언 될 때 루아 테이블에서 필드 값으로 함수를 갖는 방법은 무엇입니까?

function a() 
    print("function a"); 
end 

ftable = { 
    ["a"] = a, 
    ["b"] = b 
}; 

function b() 
    print("function b"); 
end 

ftable["a"](); -- prints 'function a' 
ftable["b"](); -- attempt to call field 'b' (a nil value) 

업데이트 : 다음과 같은 메커니즘을 사용하여 가능합니다.

function a() 
    print("function a"); 
end 

ftable = { 
    ["a"] = a, 
    ["b"] = "b" 
}; 

function b() 
    print("function b"); 
end 

ftable["a"](); -- prints 'function a' 
_G[ftable["b"]](); 
+2

그럴 수 없습니다. 왜 처음에이 일을하고 싶은지 자신에게 물어봐야합니다 ... – Piglet

+2

@Anish 질문에 답을 없애고 대답으로 게시하십시오.하지만 ftable.b에 함수를 할당 할 수는 있습니다. 답에 만족하면 자신의 답이더라도 답을 받아 들일 수 있습니다. (설명을 추가하면 개선 될 수 있습니다.) –

+1

마지막 행은 ftable [_G [ "b"]]()'이어야합니다. – lhf

답변

2

루아의 테이블 선언과 ​​함수 정의 (그리고 함수 호출 구문)는 매우 유연합니다. 키가 문자열이고 유효한 식별자 ({ a = a }ftable.a()) 인 경우 필드 구문 대신 필드 구문을 식별자로 사용할 수 있습니다. 이것은 ab 키의 경우입니다. 함수 정의 문 (function ftable.b ...)을 사용하여 필드를 지정할 수도 있습니다. 물론

function a() 
    print("function a") 
end 

ftable = { 
    a = a 
} 

function ftable.b() 
    print("function b") 
end 

ftable.a() -- prints 'function a' 
ftable.b() -- prints 'function b' 

, 당신은 또한 아래 "기능을"이동 코드 그것을 "기능 B"와 같은 수 있습니다. 그것은 상단에 ftable = { }을 남겨 둡니다.

코드와 다른 점은 하나입니다. 전역 변수 b은 더 이상 함수로 설정되지 않습니다. 대부분의 경우 이것이 이점으로 간주됩니다.

또한

루아에는 선언 만 정의가 없습니다 무엇 @lhf said, - 반복 처리를 다시하고 싶습니다.

함수 정의 (일반적으로)는 표현식입니다. 평가할 때 함수 값을 생성합니다. 다양한 유형의 명령문은 function ftable.b() ...과 같이 값을 변수 또는 필드에 할당 할 수 있습니다.

3

당신은 그렇게 할 수 없습니다. 루아에는 정의가 없다. 변수를 사용하기 전에 변수를 정의해야합니다.

ftable = { 
    ["a"] = true, 
    ["b"] = true, 
} 
... 
for k,v in pairs(ftable) do ftable[k]=_G[k] end 

이 코드가 기능을 전역으로 정의되어 있다고 가정 할 수있는 일

는 사용하기 전에 값을 수정 한 후 ftable이름을 기능의를 등록하는 것입니다.