zoukankan      html  css  js  c++  java
  • tcl脚本学习十二: upvar的学习

    lesson 12 : upvar的学习

    example ①

    upvar 很象c语言的引用传参,我用一个例子说明
    set a 1 ;#定义变量a, 并且值设为1
    proc test {b} {
    upvar $b mya
    puts $b
    puts $mya
    }
    test a ;#调用函数 test
    a ;#参数b的值为a(变量名)
    1 ;#由于upvar 使mya(变量名)指向a(变量名)指向的同一个变量,mya的为a的值
    upvar使的在函数内部可以更改函数外部的变量的值


    example ②


    proc SetPositive {variable value } {
    upvar $variable myvar;
    if {$value < 0} { set myvar [expr -$value];} else {set myvar $value;}
    return $myvar;
    }

    SetPositive x $x ;#调用转换函数处理变量 x
    SetPositive y $y ;#调用转换函数处理变量 y
    puts "X : $x Y: $y "
    //可发现 均为5,改变了外部的数值


    example ③ :


    proc two {y} {
    upvar 1 $y z ;# tie the calling value to variable z
    upvar 2 x a ;# Tie variable x two levels up to a
    puts "two: Z: $z A: $a" ;# Output the values, just to confirm
    set z 1; ;# Set z, the passed variable to 1;
    set a 2; ;# Set x, two layers up to 2;
    }
    //evel 有两种表示方式。当 level 为一个整数值时,表示从当前作用域向全局作用域上溯到
    level 层作用域。比如 level 为 1 时,代表调用过程作用域,level 为 2 时为上一层作用域
    //比如 level 为#0,则
    //表示全局作用域,此时的作用同 global 命令。

    example ④ :涉及到二级 一级优先级
    ;# A first level proc - This will be called by the global space code.
    proc one {y} {
    upvar $y z ;# This ties the calling value to variable z
    puts "one: Z: $z" ;# Output that value, to check it is 5
    two z; ;# call proc two, which will change the value
    }

    one y; ;# Call one, and output X and Y after the call.
    puts " X: $x Y: $y"

  • 相关阅读:
    Single Threaded Execution
    多线程(第三天)
    多线程(第二天)
    IE中float:right单独一行
    web.xml配置
    java调用asmx的webservice
    跨域访问
    jsp页面导入jstl标签
    搜索dwr做即时聊天的时候看到的问题
    LigerUI tree在ie下显示不出来/LigerUI 控件在ie下错乱
  • 原文地址:https://www.cnblogs.com/gold-life/p/5731146.html
Copyright © 2011-2022 走看看