Tcl/Tk Insight: 变量定义和类型

风行水上 @ 2009-06-20 03:39:09
标签:
    «目录»

    变量可能是所有程序语言中最基本的元素。变量最基本的属性是它的名字(Name)和它所表示的值(Value)。

    我们关心的是它的值。而名字是为了引用方便。

    人们总喜欢对事物进行细分,因此变量可能会有不同的类型,也可能会有所谓的生存周期或者命名空间。

    更多关于变量的思考,参见code:variable|程序设计中的变量

    Tcl中变量的定义和赋值

    • Tcl 中的变量在使用之前必须定义,一般定义和赋值同时进行
    • 最简单的变量定义和赋值通过set语句进行变量定义
    set variable_name variable_value
    set t_v1 123
    set t_v2 "quick fox"
    

    变量引用

    • 通过$符号加变量名的方式进行变量引用
    • 在可能引起混淆的情况下,可以用大括号把变量名括起来
    puts $t_v1
    puts $t_v2
    puts ${t_v3}_hello
    

    有趣的另一种读取变量值的方式

    set语句中,如果只有变量名,而没有变量值,则返回变量当前的值。这时也许应该称之为get更合适。

    这使得某些操作成为可能。比如所谓“变量的变量”、“双重变量”、或者变量名替换:

    set t "tmp" ; set des.tmp.v 123
    set v [set des.$t.v]
    
    set a "t" 
    set v [get $a] ; # 类似于其他语言里的 $$a
    

    变量取消

    可以unset语句取消变量的定义。通常Tcl中是不需要取消变量的。但取消变量有助于释放内存。

    unset variable_name
    unset t_v1
    unset t_v2
    

    全局变量

    • Tcl也有所谓全局变量和局部变量的区分。
    • proc定义中,默认是不能访问定义在proc之外的变量的,所有的set语句也只是影响proc定义内部的局部变量。
    • proc中访问全局变量,可以通过global语句实现
    • global只是声明变量为全局变量,但并不会“定义”该变量
    set var_a "a_123"
    set var_b "b_123"
    
    proc myproc {} {
        global var_a         ; # 声明为全局变量
    
        puts $var_a          ; # 输出:"a_123"
        catch {puts $var_b}  ; # 错误:变量不存在
    
        if [info exist var_b] {
          puts [set var_b]   ; # 输出:"b_123"
        } else {
          puts "变量不存在"
        }
    
        set var_a "a_456"
        set var_b "b_456"
    
        global var_c         ; # 新声明全局变量
        set var_c "c_456"    ; # 赋值后,外部可访问
    
        global var_d         ; # 新声明全局变量
        # set var_d "d_456"  ; # 并不赋值,外部不可访问
    }
    
    myproc
    
    puts $var_a      ; # 输出:"a_456",值已改变
    puts $var_b      ; # 输出:"b_123",值未改变
    puts $var_c      ; # 输出:"c_456",在proc中声明并赋值
    puts $var_d      ; # 错误!在proc中声明但未赋值
    

    namespace中的变量定义

    Tcl也有命名空间的概念。在namespace中,变量的定义通过variable语句来实现

    namespace eval myns {
        variable var_a "var_a_value"
        variable var_b
    
        proc my_proc {} {
            variable var_a 
            variable var_b "var_b_value"
            set var_a "var_a_value2"
        }
    }
    

    变量类型

    作为一种程序语言,我们通常至少还需要下面几种变量类型以方便数据结构的构建。

    • 字符串 (String)
    • 数值 (Number)
    • 列表 (List)
    • 数组 (Array)

    严格来说,Tcl其实只有一种变量类型,就是字符串。所有其他变量类型都可以用一种特定的字符串形式来进行访问。

    字符串

    字符串是很基本的类型,在Tcl中,任何变量都可以看作是字符串。基本上所有的变量类型也都默认为字符串。常用的字符串操作可能有

    set str "I am a string"
    string length $str
    string append str " appended"
    

    数值

    由于Tcl中的变量默认都被视为字符串,要进行数值计算,就必须用特定的命令expr来实现。比如

    set sum [expr 3.4+5.6]
    set div [expr 10/2] ; # Display 5
    puts 10/2    ; # Display 10/2 other than 5
    
    标签:

      分享到:
      comments powered by Disqus

      57/65ms