当我尝试在名称空间内重命名puts命令时,它会导致问题。我正在重命名puts,因为我不想显示特定过程的echo语句。
namespace eval temp {
namespace export print_proc
proc replacement_puts args {}
proc silentEval {script} {
rename puts original_puts
interp alias {} puts {} temp::replacement_puts
catch [list uplevel 1 $script] msg opts
rename puts {}
rename original_puts puts
return -options $opts $msg
}
proc print_proc {} {
puts "before call"
silentEval {a}
puts "aftter call"
}
proc a {} {
puts "inner call"
}
}
package provide temp 1.0
在示例中,我不想显示proc a
的回声语句。
但执行后,它显示错误Invalid Command Name "puts"
由于
答案 0 :(得分:3)
namespace eval temp {
namespace export print_proc
proc puts args {}
proc silentEval script {
catch [list uplevel 1 $script] msg opts
return -options $opts $msg
}
proc print_proc {} {
::puts "before call"
silentEval a
::puts "aftter call"
}
proc a {} {
puts "inner call"
}
}
当调用a
并调用puts
时,它实际上会优先调用::temp::puts
命令而不是全局puts
- 实际上是名称空间{{ 1}}覆盖全局puts
。在puts
我们希望调用全局print_proc
,因此我们在名称前添加puts
。
当然,所有这些都适用于::
中定义的脚本,如示例中所示。
(如果您要重新抛出异常,调用::temp
并没有多大意义,但我想这只是占位符代码。)
答案 1 :(得分:1)
您必须明确表示您正在改变全球get_the_title();
puts