GaGe

Lua_Study(5장) 본문

Study/Lua

Lua_Study(5장)

Sorrel 2022. 7. 11. 12:06
function nonils(...)
	local arg = table,pack(...)
    for i =1, arg.n do
    	if arg[i] == nill then return false end
    end
    return true
end

print(nonils(2,3,nil)) -->false
print(nonils()) -->true

1. function

남는 인자는 버려지고 인자가 모자란 경우 해당 매개변수는 nil이 된다.

f(2)       -- 3 nill
f(2, 3)    -- 2, 3
f(2, 3, 4) -- 2, 3 (4는 버려짐)

루아의 함수는 여러 값을 반환할 수 있다.

s, e = string.find("hello lua users", "lua")
print(s, e)         -- 7, 9

테이블 생성자는 반환하는 값의 개수 조정 없이 모두 받아 간다.

t = { foo0() }    --t={}
t = { foo1() }    --t={"a"}
t = { foo2() }    --t={"a", "b"}

다만 여러가지의 인자들이 한 표현식 안에 있을 때는 함수에서 반환하는 값의 개수를 하나로 줄여버린다.

print(foo2()..x)     --ax (b사라짐)

-- 이는 테이블에서도 마찬가지다.
t= {foo0(), foo2(), 4}    --t[1]=nil, t[2]="a", t[3]=4 (b사라짐)

--그래서 맨 앞에 딱 한 값만 받으려면 한번 더 감싸면 된다.
print((foo0()))
print((foo2()))

table.unpack()은 다중 반환을 해주는 특수 함수다. 인자로 받은 배열의 원소를 인덱스 1의 원소부터 모두 다중 반환한다.

print(table.unpack{10, 20, 30})    --> 10 20 30
a, b = table.unpack{10, 20, 30}    --> a=10, b=20, 30은 버려짐

f = string.find
a = {"hello", "ll"}
print(f(table.unpack(a)) == print(string.find("hello", "ll"))

-- unpack의 길이를 지정해 줄 수 있다.
print(table.unpack({"sun", "mon", "tue", "wed"}, 2, 3))    --> mon, tue
 

가변 인자 함수

함수를 호출할 대마다 서로 다른 개수의 인자를 넣을 수 있다.

function add(...)
  local s  =0
  for i, v, in ipairs{...} do   --{...}에 인자 배열
  s=s+v
 end
 return s
end
function foo(...)
  local a, b, c = ...
end

function foo(...)
  return ...
end

+ 드물기는 하지만 nil도 추가 인자로 들어갈 수 있다. 이런 경우 {...}로 만들어지는 테이블은 순수 순열이 아닐 수 있다. 원래부터 마지막 인자로 nil을 붙인 건지 아닌지를 구별할 방법이 없다. 이런 문제는 table.pack 함수를 써서 해결한다.

이 함수는 임의의 개수의 인자를 받아서, 이 인자들을 모두 담고 있는 테이블을 생성해서 반환한다. {...}과는 달리 전체 인자의 개수를 담고 있는 필드 "n"을 추가로 담고 있다는 차이가 있다.

예시 코드

 

function nonils(...)
	local arg = table.pack(...)
    for i = 1, arg.n do
    	if arg[i] == nil tehn return false end
    end
  	return true
end

print(nonils(2, 3, nil))  --> false
print(nonils())   --> true

 

이름을 붙인 인자

rename(old="temp.lua", new="temp1.lua")  --문법에 맞지 않음

rename({old="temp.lua", new="temp1.lua"})
rename{old="temp.lua", new="temp1.lua"}

function rename(arg)
	return os.rename(arg.old, arg.new)
end

 

'Study > Lua' 카테고리의 다른 글

Lua_Study(dofile vs loadfile vs load)  (0) 2022.07.12
Lua_Study(pairs와 ipairs의 차이점)  (0) 2022.07.12
Lua_Study(6장)  (0) 2022.07.11
Lua_Study(4장)  (0) 2022.07.11
LUA_study(1~3장)  (0) 2022.07.11
Comments