【问题标题】:Tcl pass variable as parameters to functionTcl 将变量作为参数传递给函数
【发布时间】:2015-12-15 10:29:14
【问题描述】:

使用 tcl,我想将可变参数传递给函数。 我试过这段代码

proc launch_proc { msg proc_name {params {}} } {
    puts "params launch_proc is $params \n"
}
proc test { param } {       
    puts "param test is $param \n"
    launch_proc "1.5.2  test param" test_standard {{*}$param param1 param2 param3"
    }       
}
test value

--> 参数 launch_proc 是 {*}$param param1 param2 param3" $param 未评估(我使用 tcl 8.5)

【问题讨论】:

  • 您只能将 3 个参数传递给 launch_proc,但您传递的参数不止这些(不正确?)。此外,报价也有问题。
  • 您将字符串{*}$param param1 param2 param3 传递给launch_proc。它看起来不像你想要的。你的意思是launch_proc "1.5.2 test param" test_standard "{*}$param param1 param2 param3"
  • 或者更好launch_proc "1.5.2 test param" test_standard [list {*}$param param1 param2 param3]
  • 当您调用test proc 时,变量$value 是否包含任何值?

标签: variables parameters tcl


【解决方案1】:

Tcl 支持使用关键字args 作为参数列表中的最后一个参数。

这是一个例子directly from the wiki

proc demo {first {second "none"} args} {
    puts "first = $first"
    puts "second = $second"
    puts "args = $args"
}

demo one
demo one two
demo one two three four five

结果

first = one
second = none
args = 
first = one
second = two
args = 
first = one
second = two
args = three four five

您也可以为此使用扩展语法,这使得以下两个对 demo 的调用等效。

demo one two three four five
set params {three four five}
demo one two {*}$params

【讨论】:

    【解决方案2】:

    您正在传递一个列表,并且需要将每个项目作为参数发送到 proc。

    proc test {p1 p2 p3} {
            puts "$p1 - $p2 - $p3"
    }
    
    set value {one two three}
    
    # This should work in tcl 8.5+
    test {*}$value
    
    set value {four five six}
    
    # For tcl < 8.5
    foreach {p1 p2 p3} $value {
            test $p1 $p2 $p3
            break
    }
    
    # or
    
    set value {seven eight nine}
    
    test [lindex $value 0] [lindex $value 1] [lindex $value 2]
    

    输出:

    $ tclsh test.tcl
    one - two - three
    four - five - six
    seven - eight - nine
    

    【讨论】:

      【解决方案3】:

      您需要upvar,并在为launch_proc 构造参数列表时使用list

      proc test {varname} {
          upvar 1 $varname value
          puts "param test is $varname => $value"
          launch_proc "1.5.2 test param" test_standard [list {*}$value par1 par2 par3]
      }
      
      proc launch_proc {msg proc_name {params {}}} {
          puts "params launch_proc: [join $params ,]"
      }
      
      set value {"a b c" "d e f" "g h i"}
      test value
      
      param test is value => "a b c" "d e f" "g h i"
      params launch_proc: a b c,d e f,g h i,par1,par2,par3
      

      【讨论】:

        猜你喜欢
        • 2015-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多