2017-01-20 2 views
1

unpack(4) 또는 unpack("hello world")이라고 가정 해 봅시다. 이 예기치 않은 행동이 있습니까?루아에서 간단한 값을 풀지 못할만한 이유가 있습니까

이유는 다음과 같이이다 :

function a(bool) 
    if bool then 
    return {1, 2}, "foo" 
    else 
    return 1, "foo" 
    end 
end 

function b(x, z) 
end 

function b(x, y, z) 
end 

i, j = a(???) 
b(unpack(i), j) -- is this ok? 
+1

당신은 코드를 실행하고 무슨 일이 일어나는지를 물어 보는 대신 어떤 일이 일어날지를 볼 수 있습니다. – Piglet

+1

'b (unpack (i), j)'를 배울 수있는 더 좋은 방법은 나쁜 예입니다 :'unpack (i)'의 결과는 하나의 값으로 조정될 것입니다. –

+1

모든 경우에 테이블을 반환하는 가장 쉬운 방법은 아닌가요? 그래서, 반환 할 값이 하나 있다면'return {1}, foo "' – tonypdmtr

답변

2

unpack(4) 오류를 숫자 값의 길이를 얻을 수

시도의 원인이됩니다

unpack("hello world")가 반환됩니다

무 무 무 무 무 무 무 무 무 무 무

그래서 그뿐만 아니라 매우 유용 아니다.

언팩은 언팩 테이블 용입니다.

루아가 과부하 기능을 지원하지 않습니다 : 당신이 루아의 최신 버전에서 작동 싶다면 당신은 지금 당신의 코드 table.unpack()

다른 문제 것을 알 것이다. 함수는 변수입니다.

당신은 쓰기 : 두 번째 정의가 처리되면

function b(x, z) 
end 

function b(x, y, z) 
end 

첫 번째 정의가 손실됩니다. 다른 표기법을 사용하면 더 명확 해집니다. 코드는

b = function (x, z) 
end 

b = function (x, y, z) 
end 

에 해당하고 난 당신이

b = 3 
b = 4 

b 4. 같은 원칙 것입니다 ... 후

+1

과 같이하십시오. 함수 정의를 덮어 쓰려고하는 점을 보더라도 'Lua는 함수 오버로딩을 지원하지 않습니다' 동일한 효과를 다른 방식으로 허용하기 때문입니다. 예를 들어, 임의의 수 또는 유형의 인수를 전달하도록 허용하는 것은 효과적으로 동일하게 작동합니다. 귀하의 예제에서'function b (x, y, z)'는'z'가'nil' 일 때'function b (x, y)'처럼 행동 할 수 있습니다. 그리고 함수의 추가 버전을 나중에 별도로 정의해야하는 경우에는 다음과 같이 항상 원래 함수를 프론트 엔드 할 수 있습니다 :'local b = function (x, y, z) b (x , y) end' – tonypdmtr

+0

수정 사항 : 1) 함수는 값이 아니라 변수입니다. 함수 값은 다른 값과 마찬가지로 참조가없는 경우 "유실"됩니다. 2) 함수 정의는 함수 값을 생성하는 표현식입니다. 코드이므로 절대로 잃어 버릴 수 없습니다. –

+1

@tonypdmtr "오버로딩"은 바인딩 확인 단계 (컴파일러 등)가있을 때만 의미가 있습니다. 루아에서 이름은 오직 한 번에 한 곳에서 한 가지만 언급합니다. 각 함수 값은 언제든지 원하는 수의 매개 변수로 호출 할 수 있습니다. 그것은 원하는 방식으로 원하는 것을 처리하고 나머지는 무시합니다. –

2

당신은에 unpack 표준 기능을 수정할 수 있습니다 동의 것이라 생각합니다 원하는 동작을 얻으십시오.

local old_unpack = table.unpack or unpack 

local function new_unpack(list, ...) 
    if type(list) ~= "table" then 
     list = {list} 
    end 
    return old_unpack(list, ...) 
end 

table.unpack = new_unpack 
unpack = new_unpack 

-- Usage: 
print(unpack(4)) 
print(unpack("hello world")) 
print(unpack(nil)) -- ops! nothing is printed! 
관련 문제