passing arrays to functions in tcl. Only upvar?

后端 未结 3 772
萌比男神i
萌比男神i 2021-01-03 03:27

As far as I understand, in tcl if you want to pass a named array to a function, you have to access the upper scope of the caller via the upvar command within th

相关标签:
3条回答
  • 2021-01-03 04:05

    As Michael indicated, there are several ways, plus a wiki page that discusses it. Just to have some of that information here, some options are:

    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
    
    • results in changes to the array being seen by the caller

    By array 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
    
    • results in changes to the array being seen by the caller
    • similar mechanism can be used to return an array
    0 讨论(0)
  • 2021-01-03 04:12

    If you're only passing in the value of the array, you could pass in a dictionary instead (hint: array get serializes an array into a dictionary value) and use the dict command to access values in it. But if you want access to the live value, upvar is definitely easiest. It's also a very fast technique; it compiles down to an extra traversal of a pointer during variable access after upvar itself finishes.

    0 讨论(0)
  • 2021-01-03 04:16

    There are other ways, like converting it into a list first (via array get and array set).

    0 讨论(0)
提交回复
热议问题