操作者的行为==
是固定的;它总是进行平等测试。实际上,它进行了一个相等性测试,该测试更喜欢进行数字相等性,并且只有在没有其他方法时才回退到字符串相等性。
因此,要改变你的行为check
必须变得非常棘手。
我会考虑使用执行跟踪来拦截其中的某些内容,check
以便您可以在局部a
变量上放置读取跟踪,这样当您读取它时,您实际上可以根据复杂规则获得它的值是否与某些内容匹配。(b
可能只保留一个1
布尔值。)执行此操作的代码非常复杂,我真的会尽量避免这样做!
如果可以的话,更容易的是重新定义proc
,以便您可以在主体上放置前缀,check
以便您可以在那里应用跟踪。甚至按摩测试本身。
# Rename the command to something that nothing else knows about (tricky!)
rename proc my_real_proc
my_real_proc proc {name arguments body} {
# Replace a simple equality with a basic no-case pattern match
if {$name eq "check"} {
set body [string map {{$a == $b} {[string match -nocase $b $a]}} $body]
}
# Delegate to the original definition of [proc] for everything else
uplevel my_real_proc $name $arguments $body
}
只要您在定义 之前运行该代码check
,您就会更改代码(无需“更改代码”)并获得您想要的功能。