Lua wiki에서 누락 된 인수에 대한 기본값을 정의하는 방법을 찾았습니다.
function myfunction(a,b,c)
b = b or 7
c = c or 5
print (a,b,c)
end
그게 유일한 방법인가요? PHP 스타일 myfunction (a,b=7,c=5)
이 작동하지 않는 것 같습니다. Lua 방식이 작동하지 않는다는 것이 아니라 이것이 유일한 방법인지 궁금합니다.
답변:
이름이 지정된 인수와 PHP 또는 Python과 같은 기본값을 원하는 경우 테이블 생성자를 사용하여 함수를 호출 할 수 있습니다.
myfunction{a,b=3,c=2}
(이는 LuaSocket의 고급 형식의 프로토콜 모듈 및 IUPLua의 생성자 와 같은 Lua의 여러 위치에서 볼 수 있습니다 .)
함수 자체는 다음과 같은 서명을 가질 수 있습니다.
function myfunction(t)
setmetatable(t,{__index={b=7, c=5}})
local a, b, c =
t[1] or t.a,
t[2] or t.b,
t[3] or t.c
-- function continues down here...
end
매개 변수 테이블에서 누락 된 값 __index
은 메타 테이블 의 테이블에서 가져옵니다 (메타 테이블에 대한 설명서 참조 ).
물론 테이블 생성자와 함수를 사용하여보다 고급 매개 변수 스타일을 사용할 수 있습니다. 필요한 것은 무엇이든 작성할 수 있습니다. 예를 들어, 다음 은 매개 변수 이름과 기본값을 정의하는 테이블에서 명명 또는 위치 인수 테이블을 가져 오는 함수와 일반 인수 목록을 취하는 함수를 구성하는 함수입니다.
언어 수준이 아닌 기능으로 이러한 호출을 변경하여 새로운 동작 및 의미 체계를 제공 할 수 있습니다.
인수 변환기를 작성하는 데 유용한 몇 가지 함수는 unpack
( table.unpack
5.2에서 이동 ), setfenv
(새 _ENV
구성 으로 5.2에서 사용되지 않음 ) 및 select
(주어진 인수 목록에서 단일 값을 반환하거나를 사용하여 목록의 길이를 반환 '#'
)입니다.
x or default
이 응답에 사용 된 표현이 매개 변수를 기본값으로 진정한 상당하지만 두 경우에만 작동하는지 그냥 간단한 해결 방법은 정말없는 nil
및 false
잘못된 매개 변수의 값은가. 부울 매개 변수의 기본값 x
이 true
이고 호출자가 명시 적 false
. 그런 다음 명시 적으로 전달 되었지만 을 x or true
제공합니다 . 더 나은 버전은 가독성이 더 좋습니다 . 그래도 명시적인 인수를 처리 할 수 없습니다 . true
false
if x == nil then x = default end
nil
제 생각에는 다른 방법이 없습니다. 그것은 단지 Lua의 사고 방식입니다. 주름이없고, 약간의 통사론 적 설탕을 제외하고는 단순한 일을하는 중복 된 방법이 없습니다.
기술적 으로 는 (이 7 로 평가 되는 유효한 값인 b = b == nil and 7 or b
경우에 사용해야 함 )이 있지만 이는 아마도 당신이 찾고있는 것이 아닐 것입니다.false
false or 7
false
더 간단한 방법은 변수를 먼저 배치하고 기본값을 마지막에 배치하는 것입니다. b = b or 7
b = b or 7
).
지금까지 내가 찾은 유일한 방법은 다음과 같이하는 것입니다.
function new(params)
params = params or {}
options = {
name = "Object name"
}
for k,v in pairs(params) do options[k] = v end
some_var = options.name
end
new({ name = "test" })
new()