2010-03-14 2 views
3

루아를 사용하여 매개 변수를 사용하여 함수를 동적으로 호출하려고합니다. 내가 문자열을 보낼 가있는 방식으로 구문 분석 :루아 : 인자로 함수를 동적으로 호출하기

  • 첫번째 인수가 클래스 인스턴스 "핸들"
  • 2가 모든 것을이 남아
  • 이 인수입니다 호출 할 수있는 기능입니다

"모듈"{ string=<instance of a class> }
분할() 인덱스 문자열 테이블을 반환하는 간단한 파서 같은 AA 테이블입니다.

function Dynamic(msg) 
    local args = split(msg, " ") 
    module = args[1] 
    table.remove(args, 1) 
    if module then 
     module = modules[module] 
     command = args[1] 
     table.remove(args, 1) 
     if command then 
      if not args then 
       module[command]() 
      else 
       module[command](unpack(args)) -- Reference 1 
      end 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

나는 그것을 호출 모듈에서 "무시"과 관련된 인스턴스에서 "제거"를 시도, 인수 "밥을"제공 "참조 1"로, "밥을 제거 무시"로이 때, 테이블에 포함 된 값 (단일 값 포함).

그러나 호출의 다른 쪽에서는 remove 함수가 인수를받지 못합니다. 심지어 "참조 1"줄을

module[command]("bob") 

으로 바꾸려고 시도했지만 동일한 결과가 나타납니다. 내가 잘못 무엇인지 알아 내려고 할 때

function TIF_Ignore:remove(name) 
    print(name) -- Reference 2 
    TIF_Ignore:rawremove(name) 
    TIF_Ignore:rawremovetmp(name) 
    print(title.. name.. " is not being ignored.") 
end 

내가 내 코드에서 "참조 2"추가 :

다음은 인수 "bob"을받지 않는 다른 기능입니다. "remove bob"을 무시하거나 "참조 1"에서 "bob"을 "unpack (args)"으로 바꿀 때 "remove"의 변수 "nil"은 여전히 ​​nil입니다.

+0

코드가 정상적으로 보입니다. "상대방"은 어떤 모습입니까? –

+0

그리고 함수 'split'은 표준 루아의 일부가 아니기 때문에 어떤 모양입니까? –

답변

3

선언 function TIF_Ignore:remove(name)function TIF_Ignore.remove(self, name)과 동일합니다. 첫 번째 경우에는 콜론을 사용하고 OOP 및 클래스를 에뮬레이트하기 위해 추가 숨겨진 매개 변수를 추가합니다. 함수를 호출하는 방법으로 name 대신 self 매개 변수로 "bob"을 전달합니다.

remove "static function"을 function TIF_Ignore.remove(name)과 같이 만들 수 있습니다. 그러나 선언과 호출 사이트 모두 비슷한 방식으로 rawremoverawremovetmp을 변경해야합니다. 다른 (더 쉬운) 옵션은 을 args 테이블에서 제거하지 말고 전달 된 첫 번째 매개 변수 여야합니다.

+0

감사! 당신이 문제를 정확히 지적했기 때문에이 anwser를 "best"로 선택했습니다. 나는 루아에서 경험하지 못했고 나는 단지 "이 일을"해보고 싶다. 감사! – Tipx

3

콜론 : 구문으로 정의 된 함수를 호출하려면 추가 인수, 즉 예상되는 테이블을 전달해야합니다. 당신이주는 특별한 예는 self를 사용하지 않기 때문에, 당신은 점 . 구문으로 전환 할 수 있지만, 전체 일반성을해야 할 경우, 아래의 코드를 보면 :

function Dynamic(msg) 
    local args = split(msg, " ") 
    local module = table.remove(args, 1) 
    if module and modules[module] then 
     module = modules[module] 
     local command = table.remove(args, 1) 
     if command then 
      local command = module[command] 
      command(module, unpack(args)) 
     else 
      -- Function doesnt exist 
     end 
    else 
     -- Module doesnt exist 
    end 
end 

또한 미성년자의 번호를 해결 한 문제 :

  • 변수는 local이어야합니다.
  • args은 항상 nil이 아닙니다.
  • 조회 modules[module]이 실패 할 수 있습니다.
  • table.remove은 제거 된 요소를 반환하고 빈 테이블에서 호출해도됩니다.
+0

감사합니다. 당신은 anceser가되어서 제가 인식하지 못했던 다른 많은 문제를 지적하고 해결할 필요가있었습니다 !! – Tipx