передача массивов в функции в tcl. Только упвар? - PullRequest
5 голосов
/ 18 августа 2010

Насколько я понимаю, в tcl, если вы хотите передать именованный массив в функцию, вы должны получить доступ к верхней области вызова с помощью команды upvar в теле вызываемого.Это единственный способ передать массив в tcl?

Ответы [ 3 ]

9 голосов
/ 19 августа 2010

Как указал Майкл, есть несколько способов, а также вики-страница, где это обсуждается.Просто для того, чтобы получить здесь некоторую информацию, есть несколько параметров:

By Upvar

proc by_upvar {&arrName} {
    upvar 1 ${&arrName} arr
    puts arr(mykey)
    set arr(myotherkey) 2
}
set myarr(mykey) 1
by_upvar myarr
info exists myarr(myotherkey) => true
  • приводит к изменениям в массиве, видимым вызывающей стороной

По массиву get / set

proc by_getset {agv} {
    array set arr $agv
    puts arr(mykey)
    set arr(myotherkey) 2
    return [array get arr]
}
set myarr(mykey) 1
array set mynewarr [by_upvar myarr]
info exists myarr(myotherkey) => false
info exists mynewarr(myotherkey) => true
  • приводит к тому, что вызывающий объект видит изменения в массиве
  • механизм может быть использован для возврата массива
5 голосов
/ 18 августа 2010

Есть другие способы , например, сначала преобразовать его в список (через array get и array set).

2 голосов
/ 20 августа 2010

Если вы передаете только значение массива, вы можете вместо этого передать словарь (подсказка: array get сериализует массив в значение словаря) используйте команду dict для доступа к значениям в ней. Но если вы хотите получить доступ к реальной стоимости, upvar определенно проще всего. Это также очень быстрая техника; он компилируется до дополнительного обхода указателя во время доступа к переменной после завершения upvar.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...