2014-05-14 4 views
1

로컬 함수를 사용하여 함수를 작성하려고합니다. main 함수는 외부 소스로부터 출력을 받고 함수는 그 입력을 변환하고 나중에 사용하기 위해 결과를 반환해야합니다. 내 문제는 내가 현재 시도하고있는 방식인데, 메인 함수 내 첫 번째 로컬 함수를 넣으려고 할 때 나는 계속 nil을 얻는다.Lua : 중첩 된 함수를 올바르게 작성하는 방법

function stats(input) 
    height, weight, name, age, gender, relate = string.match(input, "(%d*)ft,(%d*)lbs,(%w*),(%d*),(%u*),(%u)") 
    if name then 
     function nameInit(relate) 
      relateTable = {["F"] = "Friend", ["R"] = "Relative"} 
      for k,v in pairs (relateTable) do 
       if relate == k then 
        relship = v 
        return relship 
       end 
      end 
     end 
    end 
    person = name.." is "..age.." years old, weighs "..weight.." and blah blah blah.... 
    return person 
end 
print (stats("5.8ft, 160lbs, Mike Scott, 19, M, F")) 

물론,이 주제는 실제가 아니라 내가 할 노력하고있어하는 최종 응답의 측면에서 같은 라인을 따라입니다 예를 들면 다음과 같습니다. 현재 lua: filename: attempt to concatenate global 'relship' (a nil value)을 받고 있습니까? 내포 된 기능없이 원하는 응답을 얻을 수 있습니다. 그러나 내가 받고자하는 응답에 대해 더 자세히 설명하려고 할 때, 그 기능을 전지구 함수 안에두면, 나는이 응답을 받기 시작합니다. 이것은 다른 기능 내에서 기능을 사용하려고 할 때마다 내 문제인 것처럼 보입니다. 두 개의 분리 된 전역 함수를 만들 수 있고 그 중 하나에서 결과를 인쇄 할 수 있습니다. 그러나 내가 다른 것을 사용하려고 할 때, 나는 나 자신을 망쳤습니다. 초보자가 잘못하고있는 것을 더 잘 이해할 수 있도록 시간을 할애 할 수있는 사람이라면 누구나 훌륭 할 것입니다! 모두에게 감사드립니다.

+3

여기서'nameInit'을 (를) 호출하고 있습니까? 당신은 여기서 그것을 정의하고있을뿐입니다. –

+1

또한,'stats (input)'을 string.match를 사용하는 대신에'stats (ht, wt, name, age, gender, relate)'로 변경하면 안됩니다. – Josh

+2

@ColonelThirtyTwo와 함께하면 코드 스 니펫의 어느 곳에서나'relship '을 연결하지 않으므로 오류를 생성 할 수 없다고 말했습니다. 도움을 받으려면보다 정확하고 완전한 코드 목록을 제공해야합니다. (일반적인 팁으로 모든 곳에서 전역 변수를 사용하는 대신 함수를 포함하여 지역 변수를 사용하기를 원합니다.) –

답변

2

"그 기능을 사용하여 해당 입력을 변환하고 나중에 사용하기 위해 결과를 반환해야합니다."라는 진술을 기반으로 중첩 된 기능이 원하는 것을 확신하지 못합니다. 당신은 당신이 개 전역 함수가있을 때 코드가 작동하는지 말 :

function func1(args) 
    ... 
end 

function func2(args) 
    ... 
end 

을하지만 (예를 들어) 중첩이 func1func2 내부, 더 이상 작동 할 때. 루아는 중첩 된 함수를 정의 할 수 없지만, 난 단지 그들을 사용하는 두 가지 이유를 생각할 수 :

  1. 보통 upvalues으로 래퍼 함수의 인수 및/또는 지역 주민의 일부와 함께 작업을 캡슐화하는 기능을 반환 .
  2. 다른 함수가 호출 할 필요없이 래퍼 함수 내에서 호출 할 함수에 일부 논리를 캡슐화 할 수 있습니다.

케이스 (1)의 예를 들면 :

function func2(a, b, c) 
    function func1() 
     do something with a, b, c eventhough they are not args of func1 
     return result 
    end 
    return func1 
end 

someFunc = func2(1,2,3) 
.... 
result = someFunc() -- calls func1 created inside func2, using 1,2,3 

경우 2의 예를 들면 다음과 같습니다

function func2(a, b, c) 
    function func1() 
     do something with a, b, c eventhough they are not args of func1 
     return result 
    end 
    result = func1() 
    ... 
end 

func2(1,2,3) 

당신은 또한 (클래스) 인수로 전달 테이블 객체에 중첩 된 함수를 추가 할 수 있습니다, 하지만 이것을 사례 1의 변형으로 봅니다.

관련 문제