문제

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

다른 언어의 예 :

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

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

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

도움이 되었습니까?

해결책

다른 답변이 말했듯이, LUA의 문자열 연결 연산자는 두 점입니다.

간단한 예제는 다음과 같이 작성됩니다.

filename = "checkbook"
filename = filename .. ".tmp"

그러나 알아야 할 경고가 있습니다. LUA의 문자열은 불변이기 때문에 각 연결은 새로운 문자열 객체를 생성하고 소스 문자열에서 데이터를 복사합니다. 이로 인해 단일 문자열에 대한 연속적인 연결은 성능이 매우 열악합니다.

이 경우의 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() DO : 테이블에 저장된 모든 단일 (키, 값) 쌍을 생성합니다.

대부분의 경우 listvaluas() 당신은 그들의 명령을 보존하는 데 관심이있을 것입니다. 그래서 전화가 작성되었습니다 listvalues{13, 42, 17, 4} 해당 순서로 해당 값을 포함하는 문자열을 생성합니다. 하지만, pairs() 그렇게하지 않을 것입니다. 테이블 데이터 구조의 기본 구현에 의존하는 순서로 항목별로 분류됩니다. 순서는 키뿐만 아니라 키가 삽입되고 다른 키가 제거 된 순서에도 의존하는 것으로 알려져 있습니다.

물론 ipairs() 완벽한 대답도 아닙니다. "시퀀스"를 형성하는 테이블의 값 만 열거합니다. 즉, 열쇠의 값은 1에서 일부 상한까지 끊임없는 블록을 형성합니다. # 운영자. (대부분의 경우 기능 ipairs() 그 자체는 더 간단한 것으로 대체됩니다 for 단지 계산되는 루프 1 에게 #s. 이것은 LUA 5.2와 더 간단한 Luajit에서 권장되는 관행입니다. for 루프는보다 효율적으로 구현 될 수 있습니다 ipairs() 반복자.)

만약에 pairs() 실제로 올바른 접근법이며, 일반적으로 키와 값을 모두 인쇄하려는 경우입니다. 이는 데이터를 자체 설명으로하여 주문에 대한 우려를 줄입니다. 물론 LUA 유형 (제외) nil 그리고 부동 소수점 NaN) 키로 사용할 수 있습니다 (및 NaN 문자열 표현을 찾는 것은 학생의 운동으로 남겨진다. 그리고 나무와 더 복잡한 테이블 구조를 잊지 마십시오.

다른 팁

속기 버전의 운영자가 있는지 묻는 경우 .. - 없어요. 당신은 쓸 수 없습니다 a ..= b. 당신은 그것을 완전히 입력해야합니다 : filename = filename .. ".tmp"

연쇄:

LUA의 문자열 연결 연산자는 두 개의 점 ( '..')으로 표시됩니다. 두 피연산자가 문자열 또는 숫자 인 경우 §2.2.1에 언급 된 규칙에 따라 문자열로 변환됩니다. 그렇지 않으면, "concat"metamethod를 호출합니다 (§2.8 참조).

에서: http://www.lua.org/manual/5.1/manual.html#5.5.4

연합 연산자를 사용하여 문자열을 함께 결합 할 수 있습니다. ".."

이것은 내가 생각하는 변수와 동일합니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top