как работает этот массив в Tcl? - PullRequest
1 голос
/ 14 марта 2012

У меня есть вопрос о массиве в tcl, как работает следующий код:

set Employee_Info_Array(EmployeeId,EmplogeePhoneNumber) "0 12345678 0 0 0"


proc setEmployee_Info_Array {{empId} {phoneNumber} {infoList}} {
    set  Employee_Info_Array($empId,$phoneNumber) $infoList
}

proc getEmployee_Info_Array {{empId} {phoneNumber}} {
    return Employee_Info_Array($empId,$phoneNumber);
}

переменная Employee_Info_Array является массивом, и начальное значение равно «0 12345678 0 0 0», нокогда мы вызываем setEmployee_Info_Array {1,87654321, "1 1 1"}, как устанавливается этот массив?Есть ли две записи в этом массиве?как запись 1: «0 12345678 0 0 0» запись 2: «1,87654321,1 1 1»?когда мы используем getEmployee_Info_Array(1 1), что мы получаем?

1 Ответ

5 голосов
/ 14 марта 2012

В коде, который у вас есть, совершенно не так

set Employee_Info_Array(EmployeeId,EmplogeePhoneNumber) "0 12345678 0 0 0"

Теперь у вас есть массив с одной парой ключ / значение:

> parray Employee_Info_Array
Employee_Info_Array(EmployeeId,EmplogeePhoneNumber) = 0 12345678 0 0 0

Я предполагаю, что вы действительно хотели что-то вроде этого:

set Employee_Info_Array(0,12345678) "0 0 0"
> parray Employee_Info_Array
Employee_Info_Array(0,12345678) = 0 0 0

Первая команда нуждается в global, чтобы фактически использовать тот же массив:

proc setEmployee_Info_Array {{empId} {phoneNumber} {infoList}} {
   global Employee_Info_Array 
   set  Employee_Info_Array($empId,$phoneNumber) $infoList
}

Вторая команда также нуждается в global, плюс ей требуется $ для фактического возврата значения, о котором идет речь. Как и было, возвращается строка Employee_Info_Array($empId,$phoneNumber) с заменой empId и phoneNumber:

proc getEmployee_Info_Array {{empId} {phoneNumber}} {
    return Employee_Info_Array($empId,$phoneNumber);
}
getEmployee_Info_Array a b ;# returns literal value "Employee_Info_Array(a,b)"

Это было бы более правильно:

proc getEmployee_Info_Array {{empId} {phoneNumber}} {
    global Employee_Info_Array ;# same deal, needs global
    return $Employee_Info_Array($empId,$phoneNumber);
}

Наконец, способ, которым вы перечисляете вызов, будет неудачным, потому что вы передаете одно значение

setEmployee_Info_Array {1,87654321, "1 1 1"}
wrong # args: should be "setEmployee_Info_Array empId phoneNumber infoList"
    while executing
"setEmployee_Info_Array {1,87654321, "1 1 1"}"

Если вы на самом деле передаете значения так, как вы хотели, это работает лучше. Помните, что команды tcl имеют форму command ?arg1? ... ?argn?. Вы не заключаете список аргументов в фигурные скобки или не разделяете запятые:

setEmployee_Info_Array  1 87654321  "1 1 1"

Собираем все вместе:

set Employee_Info_Array(0,12345678) "0 0 0"
proc setEmployee_Info_Array {{empId} {phoneNumber} {infoList}} {
    global Employee_Info_Array
    set  Employee_Info_Array($empId,$phoneNumber) $infoList
}
proc getEmployee_Info_Array {{empId} {phoneNumber}} {
    global Employee_Info_Array
    return Employee_Info_Array($empId,$phoneNumber);
}
puts "Initial value"
parray Employee_Info_Array
setEmployee_Info_Array 1 87654321  "1 1 1"
puts "After set"
parray Employee_Info_Array

Что дает в качестве вывода:

Initial value
Employee_Info_Array(0,12345678) = 0 0 0
After set
Employee_Info_Array(0,12345678) = 0 0 0
Employee_Info_Array(1,87654321) = 1 1 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...