2009-09-10 7 views
31

많은 언어에서 변수 할당시 문자열을 연결할 수 있습니다. 루아 (Lua) 프로그래밍 언어를 사용하여 기존 변수에 명령의 출력을 추가해야하는 시나리오가 있습니다. 아래 예제와 루아에는 기능적으로 동일한 기능이 있습니까? 다른 언어의루아에서 문자열 연결

예 :

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

===== C# ===== 
string filename = "checkbook"; 
filename += ".tmp"; 
=============== 

당신의 도움에 미리 감사드립니다.

답변

62

다른 답변에서 말한 것처럼 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) 문자열 표현을 찾는 것은 학생을위한 연습으로 남겨 둡니다. 그리고 나무와 더 복잡한 테이블 구조를 잊지 마십시오.

1

문자열 연결 연산자를 사용하여 함께 결합 될 수있다 ".."이 I 생각 변수 동일

6

병합 : 루아 문자열 연결 연산자로 나타낸다

두 점 ('..'). 두 피연산자가 문자열 또는 숫자 인 경우 §2.2.1에서 언급 한 규칙에 따라 문자열로 변환됩니다. 그렇지 않으면 "concat"메타 메소드가 호출된다 (§2.8 참조). 에서

: http://www.lua.org/manual/5.1/manual.html#2.5.4

15

당신은 운영자 ..의 축약 버전이 있는지 여부를 묻는없는 경우 -에는 없다. a ..= b을 쓸 수 없습니다. filename = filename .. ".tmp"