【问题标题】:how to pass string to function in tcl?如何将字符串传递给tcl中的函数?
【发布时间】:2013-07-29 15:52:11
【问题描述】:

我有这样的功能:

proc test { {isSet "false"} } {
   if {isSet  == "true"} {
    # do something
   }
}

但是当我调用这个 proc 时,如何传递 falsetrue:

test "false" or test false?

【问题讨论】:

  • 两者都可以,但测试“false”更正确。

标签: tcl proc


【解决方案1】:

您做错了(忽略您在 if 条件表达式中使用裸词 isSet 的事实,这是行不通的)。而是这样做

proc test {{isSet "false"}} {
   if {$isSet} {
       # do something
   }
}

这将允许您根据需要调用test proc:

test 0
test 1
test [expr {1 == 0}]
test yes
test false
test "no"
test {true}
test "off"

等等……

基本思想是 Tcl 解释器将尝试解释包含在isSet 变量中的值作为布尔类型的值;有一套规则可以做到这一点:

  • 整数类型的值 0 为 false。
  • 整数类型的不同于 0 的值是 true。
  • 其他所有内容首先转换为字符串,然后
    • 字面上等于yestrueon 之一的字符串为真;
    • 字面上等于nofalseoff 之一的字符串为假。

Tcl_GetBoolean() manual 中描述了用于将字符串解释为布尔值的规则。

你的假设又犯了一个错误:Tcl 没有明确的字符串和布尔类型(因为它是无类型的)所以 "false"false 在 Tcl 解释器解析时是完全相同的东西您的脚本作为双引号和花括号在 Tcl 中用于分组, 不用于指定文字类型(并且 Tcl 没有文字)。所以我建议从the tutorial 开始,以便更好地掌握这些想法。

我在描述将值解释为布尔值时提到的类型是 Tcl 值的内部类型,并且对用户不可见 — 是的,Tcl 在内部缓存值的“本机”表示,因此当您执行 set x [expr {1 + 2}] 时,在内部分配的值to x 将有一个整数类型,但这实际上是一个实现细节。

【讨论】:

  • +1 另一种可能性是使用string is booleanstring is truestring is false 的某种组合。我注意到它们仅在解析用户值时才真正有用(其中“you betcha!”是输入的明显可能性),而不是来自程序的值。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多