2014-03-12 3 views
1

Lua for Conky에서 새로 고치기 전에 3 섹션 (간격) 지연으로 표시 할 상위 프로세스 목록을 제공하는 함수를 작성했습니다. 이를 위해서는 다음 새로 고침 전에 다음 간격마다 새로 고침 데이터를 저장하고 표시해야합니다.함수 내 전역 테이블 정의

모든 아래의 코드와 잘 작동하지만 난 t2, t3t4conky_top_control()의 기능 블록 내 글로벌 테이블 t1를 정의 할 수없는 의아해입니다. 외관상으로는 함수 코드 블록 안에 테이블 생성을 유지하려고했습니다. 필자는 테이블 앞에 "로컬"정의가없는 목록을 나열하려고했습니다. 그리고 올바른 사용법이라면 테이블 선언에 환경 선언 _G을 사용하는 올바른 구문을 찾을 수 없습니다.

그래서 질문은 다음과 같습니다. 함수 내에서 전역으로 테이블을 정의하는 방법은 무엇입니까? 특히 테이블 t1, 아래에 정의 된 t2, t3t4과 관련된 테이블입니까?

function conky_timer(interval) 
    return tonumber(conky_parse("${updates}") % interval+1) 
end 

t1,t2,t3,t4={},{},{},{} 
function conky_top_control() 
    if conky_timer(3)==1 then 
     for i=1,5 do 
     t1[i]=conky_parse('${top name '..i..'}') 
     t2[i]=conky_parse('${top pid '..i..'}') 
     t3[i]=conky_parse('${top cpu '..i..'}') 
     t4[i]=conky_parse('${top mem '..i..'}') 
     end 
    end 
    return conky_parse(t1[1]..'${goto 129}'..t2[1]..'${goto 174}'..t3[1]..'${goto 219}'..t4[1]..'\n'..t1[2]..'${goto 129}'..t2[2]..'${goto 174}'..t3[2]..'${goto 219}'..t4[2]..'\n'..t1[3]..'${goto 129}'..t2[3]..'${goto 174}'..t3[3]..'${goto 219}'..t4[3]..'\n'..t1[4]..'${goto 129}'..t2[4]..'${goto 174}'..t3[4]..'${goto 219}'..t4[4]..'\n'..t1[5]..'${goto 129}'..t2[5]..'${goto 174}'..t3[5]..'${goto 219}'..t4[5]) 
end 
+0

모든 루아 코드는 함수로 컴파일되어 모든 전역 변수가 "함수 내에서"설정됩니다 ... 이것은 여러분이 문제에 대한 잘못된 질문에 도달했다는 것을 알 수있는 지식을 제공하기위한 것입니다. –

답변

2

전역 변수가 초기화되었는지 여부를 확인하는 조건을 추가하기 만하면 전역 변수 초기화를 함수로 옮길 수 있습니다.

function conky_top_control() 
    if not t1 then 
     t1,t2,t3,t4={},{},{},{} 
    end 
    -- rest of function 
end 

이렇게하면 전역 함수는 함수에 대한 첫 번째 호출 만 빈 테이블로 설정됩니다.

+0

그건 효과가 있습니다, Thxs. – Poobah

0

루아에서이 지역으로 선언하지 않는 한 모든 변수는 전역 : 여기

는 Conky $ {루아 top_control)에서 호출 루아에있는 코드입니다.

함수 내에 전역 변수를 정의하는 중에 오류가 발생하면 Conky가 몇 가지 제한을 설정했을 수 있습니다.

+0

그것은 오류는 아니지만 원치 않는 결과입니다. 함수 블록에 t1, t2, t3, t4 = {}, {}, {}를 이동하면 코드가 실행되지만 타이머 개수 "1"에 대한 "업데이트 된"새로 고침 값만 얻습니다. 타이머 카운트 "2"및 "3"에서 테이블 변수 결과는 비어 있으며, 이는 해당 간격 카운트에 대해 유지되지 않음을 나타냅니다. 함수 내부에서 테이블의 전역 선언을 잘못 사용했다고 가정합니다 (예 : 테이블 선언 전에 '로컬'을 사용하지 않음)? 앞서 말했듯이 테이블 작성이 블록 외부에 남아 있으면 코드가 올바르게 작동합니다. 나에게 그것이 어느쪽으로 든 작동해야한다고 보인다. – Poobah

1

은 내가 global variables을 정의 할 수있는 방법/필요가 없습니다 conky_top_control의 기능 블록()

내에서 글로벌 테이블 T1, T2, T3와 T4를 정의 할 수 없습니다 것을 의아해입니다. 함수가 호출 될 때마다 변수가 다시 할당되기 때문에 할당을 함수로 옮기면 작동이 중지됩니다.

환경 정의 _G를 테이블 작성에 사용하는 올바른 구문을 찾을 수 없습니다.

_G.t1 구문을 사용하여 (글로벌) 환경의 t1 테이블을 참조 할 수 있습니다. 자세한 내용은 reference을 참조하십시오.

4

실제로는 전역 변수가 필요하지 않습니다. 일반적으로 코드 및 기타 코드에서 오류가 발생하는 것은 좋지 않습니다.

local t1,t2,t3,t4={},{},{},{} -- state variables for conky_top_control 
function conky_top_control() 
    -- use t1,t2,t3,t4 
end 

주민의 T1, T2, T3, T4가 conky_top_control 정의되는 범위에 있기 때문에, 그것들은 참고 문헌으로 캡처된다

은이 방법을보십시오. 이들의 값은 conky_top_control에 대한 호출을 통해 지속되며, 이들을 읽고 수정할 수 있습니다.

이제 외관을 고려하여 만족스러운 디자인을 제시합니다.