【问题标题】:Understanding the usage of braces了解大括号的使用
【发布时间】:2010-02-03 16:47:45
【问题描述】:

我正在学习 Tcl/Tk,但对 tcl 中花括号的使用感到困惑。

对我来说,它似乎既可以用来表示范围,也可以用来声明字符串!这是一个错误(或功能)吗?

我的解释正确吗?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    简而言之,

    • Tcl 的大括号就像 sh 的单引号一样——对单词(和行)进行分组,无需插值。
    • Tcl 的双引号的作用类似于 sh 的双引号 -- 允许插值。

    proc 定义中使用花括号并不是强制性的。这只是将脚本作为参数传递给 proc 而不进行插值的最方便的方法。

    这些是等价的

    proc add3 {a b c} {
        return [expr {$a + $b + $c}]
    }
    

    proc add3_weird [list a b c] "return \[expr {\[set a] + \[set b] + \[set c]}]"
    

    一旦你内化了 Tcl 引用,你就会意识到 Tcl 是多么的灵活。

    【讨论】:

    • 如果答案不清楚,插值意味着会发生替换。如果你有一个名为 myvar = "some string" 的变量,那么 {a $myvar b} 将产生字符串文字 "a $myvar b"... 而 "a $myvar b" 将产生字符串文字 "a一些字符串 b"
    • 谢谢,我想我现在明白了。我猜得再多使用 tcl 才能完全理解。
    • 我喜欢说“只有在需要使用花括号时才需要使用花括号”,这意味着——与大多数语言不同——花括号用于引用。该语言中没有任何内容需要您使用花括号。它们是您可以选择使用或不使用的引用机制。当然,有一些最佳实践表明何时使用它们是明智的......
    • 我能理解“index”、“$index”、“{index}”和“{$index}”。我最近遇到了“${index}”并且是...... wut?!最终可解析,但为什么要这样写呢?
    • 因为我从未回复过该评论:当有其他文本不应成为变量名的一部分时,请使用大括号进行变量替换:set index 4; puts "this is the ${index}th index"
    【解决方案2】:

    在回复 Toddius Zho 的评论时,我看到了一些问题(我自己也有)为什么在使用变量时使用花括号,例如${var}

    在 TCL 中,标准标量变量可以由任何字符组成。 但是,变量替换运算符“$”假定您使用的是字母数字字符和下划线(加上名称空间分隔符“::”)

    因此,如果变量设置为非字母数字字符,例如“!”,则 TCL 在尝试替换该变量时会出错。

    % set myvar! 123
    123
    % puts $myvar!
    can't read "myvar": no such variable
    

    使用大括号替换运算符不会出错:

    % set myvar! 123
    123
    %puts ${myvar!}
    123
    

    这是因为 TCL 不对大括号内定义的任何内容执行替换/插值。

    http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm

    【讨论】:

      【解决方案3】:

      花括号将单词组合在一起成为参数。你可以通过谷歌搜索在互联网上找到很多 tcl 的东西。这是intro

      【讨论】:

        【解决方案4】:

        ma​​n n Tcl

        这是 Tcl 解释器的手册页!阅读。再读一遍!你甚至可以考虑去一个安静的地方大声读出来。这会阻碍你阅读过快。每个字母都很重要。

        一旦您发现自己陷入“引用地狱”的境地,请返回此文档并再次阅读。

        有一个在线版本: http://www.tcl.tk/man/tcl8.5/TclCmd/Tcl.htm

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 2020-08-17
          • 2018-01-17
          • 2014-08-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多