TCL 将变量传递给 proc

TCL pass variable to proc

将参数传递给 proc,预期结果是 puts $cust_id in proc 将打印 123 而不是 $cust_id

proc hello {cust_id} {
  puts $cust_id
}

set cust_id 123
puts $cust_id
hello {$cust_id}

输出是

123
$cust_id

当你调用 hello 时,你给它一个 并且它打印它被赋予的值(因为你将它传递给 puts 里面body)。当你打电话时:

puts $cust_id

你告诉 Tcl 读取 cust_id 变量并将其用作 puts 的参数字。但如果你这样做:

hello {$cust_id}

然后你禁用替换(这就是在 Tcl 中将某些东西放在大括号中的字面意思,总是)所以你得到 $cust_id 传递给 hello(并打印出来)。


可以将变量传递给过程。您可以通过为他们提供变量名称,然后使用 upvar 将其绑定到本地名称来实现。像这样:

proc hello {varName} {
    upvar $varName someLocalName

    puts $someLocalName
}

set cust_id 123
hello cust_id

请注意,这正是上面 set 命令使用的模式。它并不特别(除了它是由 Tcl 运行时为您提供的;它是标准库,而不是语言 本身 )。

是的,upvar 名称很特殊(它将变量名转换为变量),它与 uplevel 一起是其他语言没有的 Tcl 关键特性之一没有。