English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Lua 함수

Lua에서 함수는 표현식과 표현을 추상화하는 주요 방법입니다. 특정 작업을 처리하거나 값을 계산하는 데 사용될 수 있습니다。

Lua는 많은 내장 함수를 제공하며, 이를 프로그램에서 쉽게 호출할 수 있습니다. 예를 들어, print() 함수는 전달된 매개변수를 컨트롤 타블에 출력할 수 있습니다。

Lua 함수는 주로 두 가지 용도가 있습니다:

  • 1. 지정된 작업을 완료합니다. 이 경우 함수는 호출 문으로 사용됩니다;

  • 2. 값을 계산하고 반환합니다. 이 경우 함수는 대입 문의 표현식으로 사용됩니다。

함수 정의

Lua 프로그래밍 언어 함수 정의 형식은 다음과 같습니다:

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end

해석:

  • optional_function_scope: 이 매개변수는 선택적으로 함수가 전역 함수인지 지역 함수인지를 지정합니다. 매개변수를 설정하지 않으면 기본적으로 전역 함수로 설정됩니다. 함수를 지역 함수로 설정하려면 키워드 local

  • function_name: 함수 이름을 지정합니다。

  • argument1, argument2, argument3..., argumentn: 함수 매개변수,여러 매개변수는 쉼표로 구분됩니다. 함수는 매개변수 없이도 사용할 수 있습니다.

  • function_body: 함수 본문,함수에서 실행해야 할 코드 문장 블록.

  • result_params_comma_separated: 함수 반환 값,Lua 언어 함수는 여러 값을 반환할 수 있으며 각 값은 쉼표로 구분됩니다。

  • 온라인 예제

    다음 예제는 함수를 정의합니다 max(),매개변수는 num1, num2,두 값의 크기를 비교하고 최대값을 반환합니다:

    --[[ 함수는 두 값을의 최대값을 반환합니다 --]]
    function max(num1, num2)
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
       return result; 
    end
    -- 함수 호출
    print("두 값 비교의 최대值为 " ,max(10,4))}}
    print("두 값 비교의 최대值为 " ,max(5,6))}}

    위 코드의 실행 결과는 다음과 같습니다:

    두 값 비교의 최대值为     10
    두 값 비교의 최대值为     6

    Lua에서는 함수를 함수에 전달할 수 있습니다. 다음 예제와 같이:

    myprint = function(param)
       print("이것은 출력 함수입니다" -   ##",param,"##)
    end
    function add(num1,num2,functionPrint)
       result = num1 + num2
       -- 전달된 함수 매개변수를 호출합니다
       functionPrint(result)
    end
    myprint(10)
    -- myprint 함수를 매개변수로 전달합니다
    add(2,5,myprint)

    위 코드의 실행 결과는 다음과 같습니다:

    이것은 출력 함수입니다 -   ##    10    ##
    이것은 출력 함수입니다 -   ##    7    ##

    다중 반환값

    Lua 함수는 여러 결과 값을 반환할 수 있습니다. 예를 들어 string.find는 "www.w"와 같은 문자열에서 일치하는 문자열의 시작과 끝의 인덱스를 반환합니다. 일치하는 문자열이 없으면 nil을 반환합니다.

    > s, e = string.find("ko.oldtoolbag.com", "w3codebox") 
    > print(s, e)
    5    10

    Lua 함수에서 return 뒤에 반환하고자 하는 값을 나열하면 다중 값을 반환할 수 있습니다. 예를 들어:

    function maximum (a)
        local mi = 1             -- 최대값 인덱스
        local m = a[mi]          -- 최대값
        for i,val in ipairs(a) do
           if val > m then
               mi = i
               m = val
           end
        end
        return m, mi
    end
    print(maximum({8,10,23,12,5))

    위 코드의 실행 결과는 다음과 같습니다:

    23    3

    변경 가능한 매개변수

    Lua 함수는 C 언어와 유사하게 변경 가능한 수의 매개변수를 받을 수 있으며, 함수 매개변수 목록에서 세점 ...을 사용하여 함수가 변경 가능한 매개변수를 가지고 있다는 것을 나타냅니다.

    function add(...)  
    local s = 0  
      for i, v in ipairs{...} do   --> {...}는 모든 변형 가능한 매개변수로 구성된 배열을 나타냅니다  
        s = s + v  
      end  
      return s  
    end  
    print(add(3,4,5,6,7))}}  --->25

    우리는 변경 가능한 매개변수를 변수에 할당할 수 있습니다.

    예를 들어, 우리는 몇 개의 숫자의 평균을 계산할 수 있습니다:

    function average(...)
       result = 0
       local arg={...}    --> arg은 테이블이며, 지역 변수입니다
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("전체로 입력된 " .. #arg .. " 개수")
       return result/#arg
    end
    print("평균값은",average(10,5,3,4,5,6))}}

    위 코드의 실행 결과는 다음과 같습니다:

    전체로 전달된 6 개수
    평균 값은    5.5

    우리는 select("#",...)를 통해 변경 가능한 매개변수의 개수를 얻을 수 있습니다:

    function average(...)
       result = 0
       local arg={...}
       for i,v in ipairs(arg) do
          result = result + v
       end
       print("전체로 입력된 " .. select("#",...) .. " 개수")
       return result/select("#",...)
    end
    print("평균값은",average(10,5,3,4,5,6))}}

    위 코드의 실행 결과는 다음과 같습니다:

    전체로 전달된 6 개수
    평균 값은    5.5

    때로는 몇 가지 고정 매개변수와 변화하는 매개변수가 필요할 수 있습니다. 고정 매개변수는 변화하는 매개변수 앞에 위치해야 합니다:

    function fwrite(fmt, ...)  ---> 고정 매개변수 fmt
        return io.write(string.format(fmt, ...))     
    end
    fwrite("w3codebox\n")       --->fmt = "w3codebox", 변화하는 매개변수가 없습니다.  
    fwrite("%d%d\n", 1, 2)   --->fmt = "%d%d", 변화하는 매개변수는 1 와 2

    출력 결과는 다음과 같습니다:

    w3codebox
    12
  • 변화하는 매개변수를 순회할 때는 {…}만 사용하면 됩니다. 하지만 변화하는 매개변수에 nil이 포함될 수 있으므로 select 함수를 사용하여 변화하는 매개변수에 접근할 수 있습니다:select('#', …) 또는 select(n, …)

    • 번째 매개변수를 반환합니다.

    • select(n, …)는 매개변수 목록의 n 번째 매개변수를 반환합니다.

    select 함수를 호출할 때는 고정 매개변수 selector(선택 스위치)와 일련의 변화하는 매개변수를 전달해야 합니다. selector가 숫자 n이면 select가 매개변수 목록의 n 개 매개변수가 있으면 select가 변화하는 매개변수의 총 수를 반환합니다. 그렇지 않으면 문자열 #만 반환됩니다.

    예제 코드:

    do  
        function foo(...)  
            for i = 1, select('#', ...) do  --> 매개변수 총 수 얻기
                local arg = select(i, ...); --> 매개변수 읽기
                print("arg", arg);  
            end  
        end  
      
        foo(1, 2, 3, 4);  
    end

    출력 결과는 다음과 같습니다:

    arg    1
    arg    2
    arg    3
    arg    4