문제

어떻게 함수를 호출될 필요가 있는 불 위에서의 창작?기로 앞으로 선언하지만 구글지 않은 도움이 되는 이 경우.무엇이 올바른 문법을 이?

도움이 되었습니까?

해결책

Lua 적 언어와 기능은 값의 종류라고 할 수있는 가 () 연산자입니다.그래서 당신은 정말 필요 없으로 전달하는 함수를 선언하고 그렇게 많은지 확인하는 변수는 범위에서 전화할 때 그것은 변수를 생각합니다.

이 문제에 대한 글로벌 변수를 포함하는 기능 때문에,글로벌 환경이 기본 장소를 찾을 해결하려면 변수 이름을 지정합니다.현지 함수,그러나 당신이 필요가 있는지 확인 지역 변수가 이미에서 범위에서의 어휘는 점에 당신을 호출해야하는 값을 저장하고,또한지 확인하는 실행 시간에 그것은 정말 들고 가치 있는 호출될 수 있습니다.

예를 들어,여기에는 한 쌍의 상호 재귀 현지 기능:

local a,b
a = function() return b() end
b = function() return a() end

의 과정,또한 사용 예를 꼬리 호출을 허용 무한 재귀는 아무것도하지 않는다,그러나 여기에서 중요한 점은 선언입니다.을 선언하여 변수 local 기 전에 하나 기능이 있고 그 안에 저장된,그 이름은 것으로 알려진 지역 변수에서의 어휘의 범위는의 나머지 부분은 예입니다.그런 다음 두 기능은 저장된 각 참조하여 다른 변수가 있습니다.

다른 팁

실제 기능 본문을 선언하기 전에 이름을 선언하여 함수를 선언 할 수 있습니다.

local func1
local func2 = function()
  func1()
end
func1 = function()
  --do something
end
.

앞으로 선언은 로컬 범위와 함수를 선언 할 때만 필요합니다.일반적으로 원하는 대상이지만 LUA는 C와 같은 구문을 지원합니다.이 경우 앞으로 선언은 필요하지 않습니다 :

function func2()
  func1()
end
function func1()
  --do something
end
.

FreeSwitch의 임베디드 LUA에서 테스트, 앞으로 선언이 작동하지 않습니다 :

fmsg("CRIT", "It worked.")
function fmsg(infotype, msg)
   freeswitch.consoleLog(infotype,  msg .. "\n")
end
.

결과 :

[Err] mod_lua.cpp : 203 /usr/local/freeswitch/scripts/foo.lua : 1 : 글로벌 'fmsg'(nil 값)

호출 시도

순서를 반전 (DUH) 작업.

루아가 작동하는 전진을 C와 비교하여 얼마나 전달하는지, C 컴파일과 LUA 실행 간의 기본 차이를 이해해야합니다.

  • C에서, 포워드 참조는 컴파일 시간 메커니즘이다. 따라서 C 모듈에 앞으로 선언 템플릿을 포함하는 경우 다음 코드가 다음과 같은 코드 가이 템플리트를 통화를 컴파일 할 수 있습니다. 동일한 모듈에 함수 구현을 포함 할 수도 있고 포함하지 않을 수도 있습니다.이 경우 두 선언이 의미 론적으로 동일하거나 컴파일러가 오류가 발생해야합니다. 이것이 컴파일 타임 구성이므로 컴파일 된 코드는 모든 순서로 실행될 수 있습니다.

  • Lua에서, 포워드 참조는 런타임 메커니즘이며, 컴파일 된 함수는 코드 내에서 내부적으로 기능 프로토 타입을 생성하지만 런타임 루아 변수 또는 값만큼 액세스 할 수 있습니다 실행이있다 Lua 폐쇄 을 만드는 선언문을 통과 시켰습니다. 여기서 소스 내의 선언 순서는 중요하지 않습니다. 중요한 실행 순서입니다. 폐쇄가 아직 변수에 바인딩되지 않은 경우 실행 은 "nil 값"예외를 던지십시오. 로컬을 사용하는 경우


    변수는 기능 값을 누른 다음 일반 로컬 범위 지정 규칙이 적용됩니다. local 선언은 소스의 사용 앞에 가야하며 범위 내에 있어야합니다. 그렇지 않으면 컴파일러가 잘못된 전역 또는 외부 로컬 참조로 컴파일됩니다. 따라서 다른 답변에서 논의 된 지역 주민을 사용하는 지역을 사용하는 것이 이지만 첫 번째 호출이 실행되기 전에 프로토스가 클로저에 묶여있는 경우에만

정의하기 전에 기능을 호출하려고하면

가 나를 위해 작동하지 않습니다.나는이 루아 스크립트를 nginx conf에서 사용하고 있습니다.

LUA 입력 스레드가 중단되었습니다 : 런타임 오류 : LUA_REDIRECT.LUA : 109 : 글로벌 'ThroweRorifany'(NIL 값)

을 호출하려고 시도합니다.

코드 스 니펫 -

...
throwErrorIfAny()
...

function throwErrorIfAny()
    ngx.say("request not allowed")
    ngx.exit(ngx.HTTP_OK)
end
.

다른 답변이 그것이 그들에게 일하지 않았다는 것을 지적했다. 루아의 전달 선언이 다른 도구와 함께 작동하지 않는 것이 가능하다.

PS : 기능 정의를 전에 넣은 다음 WASHS 후에 호출하면 괜찮습니다.

OOP를 사용하는 경우 "정의"를하기 전에 모든 기능 구성원을 호출 할 수 있습니다.

local myClass = {}
local myClass_mt = { __index = myClass }

local function f1 (self)

    print("f1")
    self:later() --not yet "delared" local function
end

local function f2 (self)

    print("f2")
    self:later() --not yet "declared" local function   
end
--...
--later in your source declare the "later" function:
local function later (self)

    print("later")   
end

function myClass.new()    -- constructor
    local this = {}

    this = {
        f1 = f1,
        f2 = f2,
        later = later,  --you can access the "later" function through "self"
    }

    setmetatable(this, myClass_mt)

    return this
end

local instance = myClass.new()

instance:f1()
instance:f2()
.

프로그램 출력 :

f1
later
f2
later
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top