다른 답변에서 말한 것처럼 Lua의 문자열 연결 연산자는 두 개의 점입니다.
귀하의 간단한 예를
는 다음과 같이 기록 될 것입니다 :
filename = "checkbook"
filename = filename .. ".tmp"
그러나, 인식 될 수있는 경고가있다. Lua의 문자열은 불변이므로 각 연결은 새 문자열 객체를 만들고 소스 문자열의 데이터를 그 문자열에 복사합니다. 따라서 단일 문자열에 대한 연속적인 연결은 성능이 매우 떨어집니다.
이
이 경우에 대한 루아 관용구이 같은 것입니다 :
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
문자열을 수집하여 배열 t
에 연결된되는, 표준 라이브러리 루틴 table.concat
이와 함께 (그들 모두를 연결하여 사용할 수 있습니다 불필요한 문자열 복사없이 각 쌍 사이의 구분자 문자열).
업데이트 : 난 그냥 내가 원래 pairs()
를 사용하는 대신 ipairs()
위의 코드를 쓴 것으로 나타났습니다.
원래 작성된 것처럼 함수 listvalues()
은 전달 된 테이블의 모든 값을 실제로 생성하지만 안정적이거나 예측 가능한 순서는 생성하지 않습니다. 반면에, 키의 값이 1
에서 #s
사이의 양의 정수가 아닌 값을 포함합니다. 그것이 바로 pairs()
입니다 : 테이블에 저장된 모든 단일 (키, 값) 쌍을 생성합니다.
listvaluas()
과 같은 것을 사용하려는 경우 대부분 순서를 보존하는 것이 좋습니다. 따라서 listvalues{13, 42, 17, 4}
으로 작성된 호출은 그 순서대로 그 값을 포함하는 문자열을 생성합니다.그러나 pairs()
은 그렇게하지 않을 것이며 테이블 데이터 구조의 기본 구현에 의존하는 순서로 항목을 항목별로 분류합니다. 순서는 키에 의존 할뿐만 아니라 키가 삽입되고 다른 키가 제거 된 순서에 따라 결정되는 것으로 알려져 있습니다.
물론 ipairs()
도 완벽한 대답이 아닙니다. "시퀀스"를 구성하는 테이블의 값만 열거합니다. 즉, 키가되는 값은 1에서 일부 상한까지 이어지는 깨지지 않는 블록을 형성합니다. 이는 일반적으로 #
연산자가 반환하는 값이기도합니다. (대부분의 경우 함수 ipairs()
자체가 1
에서 #s
까지 카운트되는 더 간단한 for
루프로 대체하는 것이 더 좋습니다. 이것은 Lua 5.2 및 LuaJIT에서 권장되는 방법으로 ipairs()
반복자보다 더 간단하게 for
루프를 구현할 수 있습니다. .)
pairs()
이 실제로 올바른 접근 방법 인 경우 일반적으로 키와 값을 모두 인쇄하려고합니다. 이렇게하면 데이터를 자체 설명하는 방식으로 주문에 대한 우려를 줄일 수 있습니다. 물론 Lua 타입 (nil
및 부동 소수점 NaN
제외)을 키로 사용할 수 있으므로 (문자열로도 저장할 수있는 NaN
) 문자열 표현을 찾는 것은 학생을위한 연습으로 남겨 둡니다. 그리고 나무와 더 복잡한 테이블 구조를 잊지 마십시오.