모듈:레프르
Module이 모듈에는 Lua 객체의 문자열 표현을 생성하는 기능이 포함되어 있습니다.Python의 repr 기능에서 영감을 받았습니다.
사용.
모듈을 사용하려면 먼저 모듈을 가져와야 합니다.
현지의 mRepr = 요구하다("모듈:대표") 그런 다음 포함된 기능을 사용할 수 있습니다.각 기능에 대한 설명서는 다음과 같습니다.
리퍼
이 함수는 주어진 Lua 객체의 문자열 표현을 생성합니다.이 함수가 생성하는 문자열을 복사하여 Lua 프로그램에 다시 붙여넣으면 원래 개체를 재현할 수 있습니다.이것이 모든 가치에 적용되는 것은 아니지만, 단순한 경우에도 적용되어야 합니다.
예를들면,mRepr.repr({bool = true, number = 6, str = "hello world"})문자열을 출력합니다.{bool = true, number = 6, str = "hello world"}.
기본 구문:
mRepr.리퍼(가치) 전체 구문:
mRepr.리퍼(가치, 옵션들) 매개 변수:
value문자열로 변환할 값입니다.임의의 Lua 값일 수 있습니다.이 매개 변수는 선택 사항이며 기본값은nil.options옵션 표입니다.이 매개 변수는 선택 사항입니다.
옵션 테이블에서 다음 옵션을 지정할 수 있습니다.
prettytrue이면 문자열을 "예쁜" 형식으로 출력합니다(예쁜 인쇄에서처럼).테이블 항목 사이에 새 줄과 들여쓰기가 추가됩니다.거짓인 경우 한 줄에 모든 형식을 지정합니다.기본값은 false입니다.tabs참이면 탭으로 들여쓰기, 그렇지 않으면 공백으로 들여쓰기를 수행합니다.기본값은 true입니다.이것은 다음과 같은 경우에만 효과가 있습니다.pretty사실입니다.spaces들여쓰기할 공백 수(예:tabs거짓입니다.기본값은 4입니다.이것은 다음과 같은 경우에만 효과가 있습니다.pretty사실입니다.semicolons참인 경우 테이블 항목은 세미콜론으로 구분됩니다.거짓인 경우 공백으로 구분됩니다.기본값은 false입니다.sortKeys참인 경우, 다른 테이블 키 형식이 적용된 후(예: 대괄호 추가) 테이블 키를 사전 순서로 정렬합니다.거짓인 경우 테이블 키는 임의의 순서(쌍 기능에 의해 처리되는 순서)로 출력됩니다.기본값은 true입니다.depth최상위 개체를 출력할 들여쓰기 깊이입니다.기본값은 0입니다.이것은 다음과 같은 경우에만 효과가 있습니다.pretty사실입니다.
특징:
- 함수는 순환 테이블을 우아하게 처리합니다. 순환을 감지하면 내부 테이블은 다음과 같이 렌더링됩니다.
{CYCLIC}. __tostring메타메소드가 사용 가능한 경우 자동으로 호출됩니다.- 테이블의 시퀀스 부분은 항상 시퀀스로 렌더링됩니다.키-값 쌍도 있는 경우 시퀀스 부분 뒤에 렌더링됩니다.
여기 모든 종과 휘파람을 자랑하는 예가 있습니다.
현지의 마이테이블 = { 안녕하세요. = "repr", 유용성 = 100, 사용이 간편함 = 진실의, 순서 = {"a", "시퀀스", "테이블"}, 혼합의 = {"a", "시퀀스", 와 함께 = "키-값 쌍"}, 하위 테이블 = { 추가 정보 = "하위 테이블에서 재귀적으로 호출" }, ToString 사용 = 상을 차리다({}, {__ 문자열로 = 기능. () 돌아가다 "__to 문자열 함수는 자동으로 호출됩니다." 끝.}), ["$YMBOL$"] = "Lua 식별자가 아닌 키가 인용됨"; [{또한. = "키와 같은 테이블도 작동합니다.";}] = "만약 당신이 그것이 필요하다면", 주기적인 = {메모 = "주기 표가 {CYCLIC}(으)로 인쇄됨"} } 마이테이블.주기적인.주기적인 = 마이테이블.주기적인 주기 만들기 현지의 옵션들 = { 예쁘다 = 진실의, \n과 들여쓰기로 인쇄하시겠습니까? 세미콜론 = 거짓의, 테이블을 인쇄할 때 쉼표(,) 대신 세미콜론(;)을 사용합니다. 정렬 키 = 진실의, 사전 테이블을 인쇄할 때 키를 알파벳 순으로 정렬하시겠습니까? 공간 = 3, 인쇄를 예쁘게 할 때 들여쓰기 위해 몇 칸을 사용합니까? 탭 = 거짓의, 예쁜 인쇄를 할 때, 공백 대신 탭을 사용합니까? 깊이 = 0, 예쁜 인쇄를 할 때, 어느 단계에서 들여쓰기를 시작해야 합니까? } mw.로그.(mRepr.리퍼(마이테이블, 옵션들)) 그러면 다음 항목이 기록됩니다.
["$YMBOL$"] = "Lua 식별자가 아닌 키는 따옴표로 묶임", [{또한 = "키로서의 테이블도 작동함"}] = "필요한 경우", 주기적 = {cyclic = {CYCLIC}(으)로 인쇄됨", 참고 = "cyclic table은 단지 {CYCLIC}(으)로 인쇄됨", 안녕하세요 = "rep", 쉬운 일입니다.= true를 사용하려면 혼합 = {"a", "sequence", = "key-value pairs" =, 시퀀스 = {"a", "sequence", "table", subTable", = {moreInfo = "callself on sub-value", 유용성 = 100, usesToString 함수는 자동으로 호출됩니다. 호출Repr
이 함수는 함수 호출의 문자열 표현을 생성합니다.
기본 구문:
mRepr.호출Repr{funcName = 함수Name, 논병아리 = 함수 인수} 전체 구문:
mRepr.호출Repr{funcName = 함수Name, 논병아리 = 함수 인수, 옵션들 = 옵션들} 매개 변수:
funcName함수 이름입니다.이 매개 변수는 필수이며 문자열이어야 합니다.args함수 인수입니다.시퀀스 테이블이어야 합니다.시퀀스 항목은 임의의 Lua 값일 수 있으며, 각 항목은 [#repr] 함수를 사용하여 렌더링됩니다.이 인수는 선택 사항입니다.options옵션 표입니다.옵션은 repr 함수의 경우와 동일합니다.이 인수는 선택 사항입니다.
예:
mRepr.호출Repr{funcName = "myFunc", 논병아리 = {"테스트", 4, 진실의, {"a", "b", "c"}}} 결과:myFunc("test", 4, true, {"a", "b", "c"})
요구하다('''비공식''') 현지의 라이브러리유틸 = 요구하다("라이브러리유틸") 현지의 checkType = 라이브러리유틸.checkType 현지의 명명된 인수의 유형 확인 = 라이브러리유틸.명명된 인수의 유형 확인 현지의 기본 옵션 = { 예쁘다 = 거짓의, 탭 = 진실의, 세미콜론 = 거짓의, 공간 = 4, 정렬 키 = 진실의, 깊이 = 0, } represcursive 변수를 정의하여 represcursive를 호출할 수 있습니다. renderSequence의 함수와 renderKeyValueTable을 가져오지 않고 "nill global represcursive" 오류를 읽으려고 했습니다. 현지의 재귀적 현지의 lua키워드 = { ["그리고"] = 진실의, ["브레이크"] = 진실의, ["하다"] = 진실의, ["스캐너덜너덜] = 진실의, ["만약"] = 진실의, ["끝"] = 진실의, ["거짓"] = 진실의, ["용"] = 진실의, ["함수"] = 진실의, ["만약"] = 진실의, ["in"] = 진실의, ["로컬"] = 진실의, ["스캐너덜너덜] = 진실의, ["아니오"] = 진실의, ["또는"] = 진실의, ["스캐너덜너덜] = 진실의, ["반품"] = 진실의, ["그러면"] = 진실의, ["참"] = 진실의, ["까지"] = 진실의, ["그 동안"] = 진실의, } --[[ 주어진 값이 유효한 Lua 식별자인지 여부(즉, 가능한지 여부) 변수 이름으로 사용됩니다.) --]] 현지의 기능. isLuaIdentifier(스트르) 돌아가다 유형(스트르) == "문자열" a-z, A-Z 또는 밑줄로 시작해야 하며 다음을 포함할 수 있습니다. a-z, A-Z, 0-9 및 밑줄 그리고. 스트르:찾아내다("^[%a_][%a%d_]*$") ~= 영의 Lua 키워드가 될 수 없습니다. 그리고. 것은 아니다. lua키워드[스트르] 끝. --[[ 문자열 표현을 렌더링합니다. --]] 현지의 기능. renderString(s) 돌아가다 (("%q"):서식을(s):gsub("\\\n", "\\n")) 끝. --[[ 숫자 표현을 렌더링합니다. --]] 현지의 기능. 렌더 번호(n) 한다면 n == 수학, 수학,수학 그리고나서 돌아가다 "math.dll" 그렇지 않으면 n == -수학, 수학,수학 그리고나서 돌아가다 "-math.dll" 또 다른 돌아가다 끈으로 묶는(n) 끝. 끝. --[[ 테이블에 __to 문자열 메소드가 있는지 여부입니다. --]] 현지의 기능. haveTostringMethod 메서드(t) 돌아가다 배불리 먹다(t) 그리고. 유형(배불리 먹다(t).__ 문자열로) == "함수" 끝. --[[ 일련의 문자열 표현을 예쁘게 인쇄합니다. 이것은 값에 따라 다른 구조를 나타내도록 만들 수 있습니다. 접두사, 접미사 및 구분 기호입니다.빈 공간의 양은 다음에 의해 제어됩니다. 깊이 및 들여쓰기 매개 변수. --]] 현지의 기능. 깊이 있는 예쁜 인쇄 항목(항목들, 접두어, 접미사, 구분자, 들여쓰기, 깊이) 현지의 현재 깊이의 공백 = "\n" .. 들여쓰기:대리인(깊이) 현지의 다음 깊이의 공백 = 현재 깊이의 공백 .. 들여쓰기 현지의 리트 = {접두어, 다음 깊이의 공백} 현지의 첫번째 = 항목들[1] 한다면 첫번째 ~= 영의 그리고나서 표.삽입(리트, 첫번째) 끝. 위해서 i = 2, #항목들 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 표.삽입(리트, 구분자) 표.삽입(리트, 다음 깊이의 공백) 표.삽입(리트, 항목들[i]) 끝. 표.삽입(리트, 현재 깊이의 공백) 표.삽입(리트, 접미사) 돌아가다 테이블.콘캣(리트) 끝. --[[ 문자열 표현 순서를 렌더링합니다. 이것은 다음의 값에 따라 다른 구조를 나타내도록 만들 수 있습니다. 접두사, 접미사 및 구분 기호. --]] 현지의 기능. 렌더 항목(항목들, 접두어, 접미사, 구분자) 돌아가다 접두어 .. 테이블.콘캣(항목들, 구분자 .. " ") .. 접미사 끝. --[[ 일반 테이블( __to string 메소드가 없는 비순환 테이블)을 렌더링합니다. 이것은 시퀀스 테이블, 키 값 테이블 또는 둘의 혼합일 수 있습니다. --]] 현지의 기능. 렌더일반 테이블(t, 맥락, 깊이) 현지의 항목들 = {} 시퀀스 부분의 항목 렌더링 현지의 보이는 = {} 위해서 i, 가치 에 짝을 짓다(t) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 표.삽입(항목들, 재귀적(t[i], 맥락, 깊이 + 1)) 보이는[i] = 진실의 끝. 키 값 부분의 항목 렌더링 현지의 키오더 = {} 현지의 키값 문자열 = {} 위해서 k, v 에 쌍들(t) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 한다면 것은 아니다. 보이는[k] 그리고나서 현지의 kStr = isLuaIdentifier(k) 그리고. k 또는 ("[" .. 재귀적(k, 맥락, 깊이 + 1) .. "]") 현지의 vStr = 재귀적(v, 맥락, 깊이 + 1) 표.삽입(키오더, kStr) 키값 문자열[kStr] = vStr 끝. 끝. 한다면 맥락.정렬 키 그리고나서 테이블. 테이블.(키오더) 끝. 위해서 _, kStr 에 짝을 짓다(키오더) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 표.삽입(항목들, string.형식(%s = %s", kStr, 키값 문자열[kStr])) 끝. 테이블 구조 렌더링 현지의 접두어 = "{" 현지의 접미사 = "}" 한다면 맥락.예쁘다 그리고나서 돌아가다 깊이 있는 예쁜 인쇄 항목( 항목들, 접두어, 접미사, 맥락.구분자, 맥락.들여쓰기, 깊이 ) 또 다른 돌아가다 렌더 항목(항목들, 접두어, 접미사, 맥락.구분자) 끝. 끝. --[[ 지정된 테이블을 렌더링합니다. 이 함수는 일반 테이블 렌더링뿐만 아니라 순환 테이블도 렌더링합니다. __to string 메타 메서드를 사용하는 테이블. --]] 현지의 기능. 렌더 테이블(t, 맥락, 깊이) 한다면 haveTostringMethod 메서드(t) 그리고나서 돌아가다 끈으로 묶는(t) 그렇지 않으면 맥락.표시된[t] 그리고나서 돌아가다 "{CYCLIC}" 끝. 맥락.표시된[t] = 진실의 현지의 결과 = 렌더일반 테이블(t, 맥락, 깊이) 맥락.표시된[t] = 거짓의 돌아가다 결과 끝. --[[ 지정된 값의 문자열 표현을 재귀적으로 렌더링합니다. --]] 기능. 재귀적(가치, 맥락, 깊이) 한다면 가치 == 영의 그리고나서 돌아가다 "스캐너덜너덜 끝. 현지의 valueType = 유형(가치) 한다면 valueType == "스캐너덜너덜 그리고나서 돌아가다 끈으로 묶는(가치) 그렇지 않으면 valueType == "숫자" 그리고나서 돌아가다 렌더 번호(가치) 그렇지 않으면 valueType == "문자열" 그리고나서 돌아가다 renderString(가치) 그렇지 않으면 valueType == "테이블" 그리고나서 돌아가다 렌더 테이블(가치, 맥락, 깊이) 또 다른 돌아가다 "<" .. valueType .. ">" 끝. 끝. --[[ 사용자가 전달한 옵션 테이블을 표준화합니다. 지정되지 않은 값에는 기본값이 할당됩니다. --]] 현지의 기능. 표준화옵션(옵션들) 옵션들 = 옵션들 또는 {} 현지의 리트 = {} 위해서 선택, 기본값 에 쌍들(기본 옵션) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 현지의 가치 = 옵션들[선택] 한다면 가치 ~= 영의 그리고나서 한다면 유형(가치) == 유형(기본값) 그리고나서 리트[선택] = 가치 또 다른 오류( string.형식( '%s 옵션의 유형이 잘못되었습니다(예상 %s, 수신 %s).', 선택, 유형(기본값), 유형(가치) ), 3 ) 끝. 또 다른 리트[선택] = 기본값 끝. 끝. 돌아가다 리트 끝. --[[ 옵션 테이블에서 들여쓰기를 가져옵니다. --]] 현지의 기능. 겟인덴트(옵션들) 한다면 옵션들.탭 그리고나서 돌아가다 "\t" 또 다른 돌아가다 string.rep(" ", 옵션들.공간) 끝. 끝. --[[ 지정된 값의 문자열 표현을 렌더링합니다. --]] 현지의 기능. 리퍼(가치, 옵션들) checkType("repr", 2, 옵션들, "테이블", 진실의) 옵션들 = 표준화옵션(옵션들) 현지의 맥락 = {} 맥락.예쁘다 = 옵션들.예쁘다 한다면 맥락.예쁘다 그리고나서 맥락.들여쓰기 = 겟인덴트(옵션들) 또 다른 맥락.들여쓰기 = "" 끝. 한다면 옵션들.세미콜론 그리고나서 맥락.구분자 = ";" 또 다른 맥락.구분자 = "," 끝. 맥락.정렬 키 = 옵션들.정렬 키 맥락.표시된 = {} 현지의 깊이 = 옵션들.깊이 돌아가다 재귀적(가치, 맥락, 깊이) 끝. --[[ 지정된 함수 호출의 문자열 표현을 렌더링합니다. --]] 현지의 기능. 호출Repr(키워드Args) checkType("실행 보고서", 1, 키워드Args, "테이블") 명명된 인수의 유형 확인("실행 보고서", "funcName", 키워드Args.funcName, "문자열") 명명된 인수의 유형 확인("실행 보고서", "인수", 키워드Args.논병아리, "테이블", 진실의) 명명된 인수의 유형 확인("실행 보고서", "스캐너덜너덜, 키워드Args.옵션들, "테이블", 진실의) 현지의 옵션들 = 표준화옵션(키워드Args.옵션들) 현지의 깊이 = 옵션들.깊이 옵션들.깊이 = 깊이 + 1 현지의 항목들 = {} 한다면 키워드Args.논병아리 그리고나서 위해서 _, 아그 에 짝을 짓다(키워드Args.논병아리) 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 나다 표.삽입(항목들, 리퍼(아그, 옵션들)) 끝. 끝. 현지의 접두어 = "(" 현지의 접미사 = ")" 현지의 구분자 = "," 현지의 렌더링된 Args 한다면 옵션들.예쁘다 그리고나서 렌더링된 Args = 깊이 있는 예쁜 인쇄 항목( 항목들, 접두어, 접미사, 구분자, 겟인덴트(옵션들), 깊이 ) 또 다른 렌더링된 Args = 렌더 항목(항목들, 접두어, 접미사, 구분자) 끝. 돌아가다 키워드Args.funcName .. 렌더링된 Args 끝. 돌아가다 { _isLuaIdentifier = isLuaIdentifier, 리퍼 = 리퍼, 호출Repr = 호출Repr, } 