2014-12-05 1 views
3

내가 t 테이블, t를 호출, 같은이기 때문에, 단순한 더미 예제 파일은 documentation에 따르면 긴 단어 `__call`는

t = {} 
t.__call = print 
t.__call(1) 
t(2) 

보다 더 많은 설명 생각 내 루아 코드에서 작동하지 않습니다 t(2)t.__call(2)과 같이 t.__call 전화로 리디렉션되어야합니다. t.__call은 문제가 없지만 "구문 설탕"은 효과가 없습니다. 위 코드의 결과는 다음과 같습니다.

1 
lua: test.lua:4: attempt to call global 't' (a table value) 
stack traceback: 
     test.lua:4: in main chunk 
     [C]: in ? 

무엇이 누락 되었습니까? t(2)t.__call(2)으로 변환하지 않는 이유는 무엇입니까?

답변

5

__call은 메타 메소드이므로 테이블 자체가 아닌 테이블의 metatable에 설정해야합니다. 같은 일을하고 훨씬 더 간결 방법에 대한

t = {} 
m = {} 
m.__call = print 

setmetatable(t, m) 

t(2) 

Check it out here. 참조 @Deduplicator 우수한 코멘트.

+7

또는 훨씬 짧습니다 :'t = setmetatable ({}, {__call = print})' – Deduplicator

관련 문제