2012-04-02 1 views
1

현재 내가하려고하는 것은 person_records (값)를 보유하는 전자 메일 주소 (키)의 테이블을 만드는 것입니다. person_record가 6 개 정도를 저장하고있는 곳. 내가 쓴lua Hashtables, 테이블 인덱스는 nil입니까?

random_record = split(line, ",") 
person_record = {first_name = random_record[1], last_name = random_record[2], email_address = random_record[3], street_address = random_record[4], city = random_record[5], state = random_record[6]} 
email_table[person_record.email_address] = person_record 

: 내가 갖는 문제는 내가 불평과 테이블 인덱스가 전무하다라는 테이블에 키와 이메일 주소를 할당 할 때 ... 이것은 내가 지금까지 가지고있는 점이다 기본적으로 입력 줄을 사용하여 6 개의 쉼표로 구분 된 값을 추출하여 테이블 (random_record)에 저장합니다.

email_table [person_record.email_address] = person_record를 말하려고하면 오류가 발생합니다. 하지만 person_record.email_address를 출력 할 때 그 문자는 nil이 아니므로 저장 한 문자열을 인쇄합니다. 너무 혼란 스럽습니다.

function split(str, pat) 
    local t = {} -- NOTE: use {n = 0} in Lua-5.0 
    local fpat = "(.-)" .. pat 
    local last_end = 1 
    local s, e, cap = str:find(fpat, 1) 
    while s do 
     if s ~= 1 or cap ~= "" then 
    table.insert(t,cap) 
     end 
     last_end = e+1 
     s, e, cap = str:find(fpat, last_end) 
    end 
    if last_end <= #str then 
     cap = str:sub(last_end) 
     table.insert(t, cap) 
    end 
    return t 
end 
+0

정확한 오류 메시지를 게시 할 수 있습니까? –

+0

불행히도 정확한 오류 메시지는 다음과 같습니다. ( "테이블 인덱스는 무효" – cj1098

답변

2

다음 코드를 복사하여 귀하의 예제에서 붙여 넣기하고 잘 실행 :

email_table = {} 
random_record = {"first", "second", "third"} 
person_record = {first_name = random_record[1], last_name = random_record[1], email_address = random_record[1]} 
email_table[person_record.email_address] = person_record 

그래서 문제가 split 기능입니다.

BTW, 루아는 "해시 테이블"이 없습니다. 키/값 쌍을 저장하는 "테이블"만 있습니다. 이러한 일이 해시를 사용하는지 여부는 구현 세부 사항입니다.

+0

아하 .. 교수님, 루아는 해시 테이블 만 가지고 있다고 말했지만 동의하지 않았습니다 : p. email_table을 통해 수행 한 모든 작업은 email_table = {} 그 다음에는 위의 코드를 할당합니다 .. email_table [ "HAHA"] = person_record와 같은 것을 말할 수 있기 때문에 그것이 0이 아니라는 것을 알고 있습니다. person_record.email_address 허용 ... – cj1098

+0

@ cj1098 : 내 게시물을 업데이트했습니다. –

+0

thats so weird ... 글쎄 고마워! :) 그냥 시작한 이래로 나는 루아에 대해 많은 질문을했습니다. 나는 아마 돌아올거야 : D – cj1098

0

쉼표로 구분 된 데이터가있는 행을 반복하는 것처럼 보입니다. 분할 기능을 살펴보면 찾을 특정 줄에 더 이상 구분 기호 (,)가 없어지면 즉시 중단됩니다. 따라서 3 이하의 분리 된 필드 (매우 일반적인 예제 인 : 파일 끝의 빈 줄)에 아무 것도 입력하지 않으면 [3]까지 올라가지 않는 테이블이 생성됩니다. 빈 테이블 값을 주소 지정하면 아무 것도 반환하지 않으므로 person_record.email_address는 코드의 두 번째 줄에서 nil로 설정됩니다. 그런 다음 person_record.email_address에 저장된이 nil을 3 행의 email_table에 대한 색인으로 사용하려고하면 언급 한 정확한 오류가 발생합니다.