Tcl proc 的约定 return

Conventions for Tcl proc return

Tcl proc return 值的约定是什么?在正常终止情况下,proc 可以 return 一个值,这很好。但是异常呢?如果 proc return 没有编程价值,那么 return 有什么好的价值?是'0'、'-1'、'/dev/null'、'True'、'False'吗?

与 Tcl 的许多事物一样,约定是多种多样的、务实的和宽容的。我们鼓励您使用异常(通过 errorthrowreturn,主要是 continuebreak 用于迭代控制等)而不是 return 指示出现问题的特殊值。

即便如此,return 值如

  • 命令结果范围之外的值(例如 -1,当范围为 ≥0 的整数时)
  • 空字符串
  • 布尔值错误(falseoffno 或零)

通常在命令不能 return 有用的值时使用。 从不 return有用值的命令,因为只有它们的副作用被认为是有用的(例如unset)几乎总是return空字符串。

(请注意,命令 returning 字符串没有超出范围的值,因为所有可能的值都是有效字符串。)

有时使用特殊的 return 值更有意义;其他时候提出错误更方便,即使对于没有经验的用户来说可能有些混乱。使用不存在的键访问字典就是一个例子。如果 Tcl 有一个 null 值,dict get $foo not-a-key 可能会 return 那个;相反,你会得到一个例外。

文档:break, continue, dict, error, return, throw, unset

But what about exceptions?

如果您遇到错误,请使用 error 指出。它创建了一个向外冒泡的异常条件,可以用 catch 捕获。在 Tcl 8.6 中,您还可以使用 throwtry/trap 来执行此操作。

在某些情况下,执行 return -code error 会更清楚,因为这会使程序产生错误,而不是您检测到问题的特定位置。

What's a good value to return if the proc returns no programmatic value?

通常的“无值”值是空字符串。如果你只是做 return,这就是实际的价值。您知道的许多 Tcl 命令(例如,putsfor)将生成空字符串作为它们的结果。如果您以交互方式使用 Tcl,则 Tcl 解释器循环不会为空结果打印任何内容。