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
(주어진 인수 목록에서 단일 값을 반환하거나를 사용하여 목록의 길이를 반환 '#'
)입니다.
답변
제 생각에는 다른 방법이 없습니다. 그것은 단지 Lua의 사고 방식입니다. 주름이없고, 약간의 통사론 적 설탕을 제외하고는 단순한 일을하는 중복 된 방법이 없습니다.
답변
기술적 으로 는 (이 7 로 평가 되는 유효한 값인 b = b == nil and 7 or b
경우에 사용해야 함 )이 있지만 이는 아마도 당신이 찾고있는 것이 아닐 것입니다.false
false 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()