2014-10-28 1 views
1

처럼 혼합 된 인덱스 테이블을 감안할 때 :숫자가 아닌 indeces 및 # 카운트 절대?

table = { 
    foo = 'bar' 
    [1] = 'foobar' 
} 

내 질문은 테이블을 반복하면서 틈으로 분리되지 않은 마지막 인덱스를 제공하는 #에 관한 것입니다.

print(#table) 

출력 1 줄 것이다.

table = { 
    foo = 'bar', 
    lol = 'rofl', 
    [1] = 'some', 
    [2] = 'thing', 
    [3] = 'anything', 
    [4] = 'else' 
} 
print(#table) 

4

내가 #이 아닌 숫자 인덱스에 의해 산만하지 않을 것이라고 100 % 확신 할 수 인쇄해야? 이러한 인덱스는 매번 무시됩니다?

+0

의미를 쉽게 이해할 수 있지만 예제 코드를 컴파일 가능하게 만드는 것이 좋습니다. '4 = else'와 같은 테이블 생성자는 분명히 불법입니다. –

+0

좋아, 끝났어. 입력하는 동안 눈치 채지 못했습니다. – Sempie

+0

코드를 작성하도록 허용합니다. 이는 키워드를 조작하는 'else'이상입니다. '[4] = 'else'는 좀 더 명확하지 않고 일반적인 문법 설탕과는 달리 보이지만 합법적입니다. –

답변

3

네, 그렇습니다 (lua 5.1에서). 루아 reference manual 가입일

: 길이 연산자는 단항 연산자 번호로 표시된다

. 의 길이는 문자열의 바이트 수입니다 (즉, 각 문자가 1 바이트 일 때 문자열 길이의 일반적인 의미).

표 t의 길이는 t [n]이 nil이 아니고 t [n + 1]이 nil이되도록 정수 인덱스 n으로 정의됩니다. 또한, t [1]이 nil이면, n은 일 수있다. 1에서 주어진 n까지의 nil이 아닌 일반 배열의 경우 길이는 정확히 마지막 값의 인덱스 인 n입니다. 배열에 "구멍"이 있으면 (즉, 다른 nil이 아닌 값 사이에 nil 값이있는 경우) #t는앞에 직접 나타나는 임의의 인덱스가 될 수 있습니다. 즉, 해당 nil 값을 고려할 수 있습니다 배열의 끝으로).

루아 5.2는 __len 메타 메서드가 테이블에서 작동하도록 허용하므로 #은 다른 작업을 수행 할 수 있습니다. 몇 가지 예를 들어 @ kikito의 대답을보십시오.

0

유일한 방법은 항목을 반복하여 계산하는 것입니다. 항목을 통해 ipair를 반복하고 증분 카운터를 누른 다음 결과를 반환합니다.

function tablelength(T) 
local count = 0 for _ in pairs(T) do 
    count = count + 1 end 
return count 
end 

# 연산자는 해시 테이블 형식에서만 작동합니다.

은 참조 : How to get number of entries in a Lua table?

+0

나는 테이블의 길이를 얻고 싶지 않다. 그것은 여기서 질문이 아니다. 그러나 이것 옆에 화산재 테이블이 무엇입니까? 구글의 러시아 친구들조차도 모른다. – Sempie

+0

죄송합니다. 질문에 대한 오해. 나는 해시 배열에 대해 말하고 있었다. Typo. 그러나이 방법을 사용하여 마지막 색인을 얻을 수 있습니다. – jDourlens

+0

'# '는 숫자가 아닌 인덱스를 가진 테이블에 대해서는 명시 적으로 * 작동하지 않습니다. –

2

ETAN의 대답은 정확하지만, 완료되지 않았습니다.

루아에서는 테이블의 메타 테이블이 __len 함수를 가지고 있다면, # 연산자가 뱉어내는 것을 제어 할 것입니다. 배열이 아닌 키를 고려하여 정의 할 수 있습니다.당신이 정말 당신이 "적절한"배열과 같은 길이를 얻을 수 있는지 확인하려면

local t = {1,2,3,4,foo='bar',baz='qux'} 

print(#t) -- 4 
setmetatable(t, mt) 
print(#t) -- 6 

, 당신은 대신 rawlen를 사용해야합니다 :

print(rawlen(t)) -- 4, even with the metatable set 
local mt = {__len = function(tbl) 
    local len = 0 
    for _ in pairs(tbl) do len = len + 1 end 
    return len 
end} 

는 것을 보여줍니다

편집 : 루아 5.1에서 언급 한대로 __len이 작동하지 않음을 유의하십시오.

+0

그리고 다시 안내에 감사하지만 질문에 맞지 않습니다. – Sempie

+0

[Lua 5.1 레퍼런스 매뉴얼] (http://www.lua.org/manual/5.1/manual.html#2.8)은 항상 '__len' 메타 메서드가 테이블 (또는 문자열)에서 작동하지 않는다고 말했습니다 ... – siffiejoe

+0

@siffiejoe 감사합니다. 수정했습니다. – kikito