2011-11-15 4 views
6

나는 루아를 배우며 익명의 기능에 대해 배웠다. 흥미 롭지 만 익명이 아닌 함수에 비해 어떤 이점이 있는지 궁금합니다. 내가익명 vs 익명 함수가 아닌 루아

function(a,b) return (a+b) end 

같은이있는 경우

그래서이 기능은 익명 내가

function add(a,b) return (a+b) end 

이있는 경우이 기능은 비 익명입니다. 두 번째는 내가 원하는 곳 어디에서나 호출 할 수 있고 내 기능이 무엇인지 알기 때문에 더 좋습니다. 그래서 익명의 함수의 장점은 무엇입니까? 내가 여기서 뭔가를 놓치고 있니?

+7

뒤로 가세요. 훨씬 더 유용한 정신 모델은'local f = function (...) ... end'에 대한 구문 적 설탕으로'function f (...) ... end'를 취급하고 함수를 일반적으로 객체로 생각합니다 귀하의 프로그램의 정적 빌딩 블록의. 왜 숫자 리터럴을 정교한 영어 이름을 사용하지 않고 사용할 수 있는지 묻지 않습니다. 그렇습니까? – delnan

답변

20

사실 루아에는이라는 이름의 과 같은 것이 없습니다. 모든 함수는 실제로 익명이지만 변수 (이름이 있음)에 저장할 수 있습니다.

명명 함수 구문add = function(a,b) return a+b endfunction add(a,b) return a+b end 실제로 대한 syntactic sugar이다.

people = {{name="John", age=20}, {name="Ann", age=25}} 
table.sort(people, function (a,b) return a.name < b.name end) 

점 : 당신이 정렬 순서를 지정할 수있는 기능을 사용하여 -

기능은 종종 이벤트 핸들러로와 라이브러리가 가장 유명한 예는 table.sort() 인, /을 알 수없는 의사 결정에 사용된다 아마 그 기능을 나중에 필요로하지 않을 것입니다. 물론, 당신은 또한 (가능 지역) 함수를 변수에 저장하고 있음을 사용할 수 있습니다

local nameComparator = function (a,b) return a.name < b.name end 
table.sort(people, nameComparator) 

자세한 내용은이 section on functions in PiL를 참조하십시오.

4

두 번째 예는 그래서 정말 사소한 의미에서, 익명 함수에게 모든 시간을 사용하고
add = function(a,b) return a+b end
에 해당합니다.

하지만 익명의 함수는 다른 컨텍스트에서 훨씬 더 유용 할 수 있습니다. 예를 들어, 함수를 사용하면 원하는 경우

function make_version_with_n_args (func, n) 
    if n == 1 then 
     return function (x) return x end 
    else 
     return function (x, ...) 
      return func (x, make_version_with_n_args (func, n-1)(...)) 
     end 
    end 
end 

add_four = make_version_with_n_args (function (a, b) return a+b end, 4) 

print (add_four(3, 3, 3, 3)) 

add_sizes = {} 
for i = 1, 5 do 
    add_sizes[i] = make_version_with_n_args(function (a, b) return a+b end, i) 
end 

func_args = {} 
for i = 1, 5 do 
    func_args[#func_args+1] = 2 
    print (add_sizes[i](unpack(func_args))) 
end 

function make_general_version (func) 
    return function (...) 
     local args = {...} 
     local result = args[#args] 
     for i = #args-1,1,-1 do 
      result = func(args[i], result) 
     end 
     return result 
    end 
end 

general_add = make_general_version (function (a, b) return a+b end) 

print (general_add(4, 4, 4, 4)) 

기본적으로, 당신은 모든 단일 기능의 이름을 만들 수 있습니다. (함수형 프로그래밍의 영혼) 다른 기능을 돌연변이,하지만 상황에서 당신은 너무 많은 주위에 던지는 곳 일회용 기능이 없기 때문에 보다 편리합니다..

관련 문제