根据规范/实现,是否存在访问命名空间变量与upvar之间的差异。 我必须使用回调函数。我不能只是通过一个论点。实际上,upvar赢了。但是,在所有合理的情况下,这是预期的吗? 感谢。
答案 0 :(得分:2)
肯定是的。完全范围的引用比dput(df)
structure(list(name = c("a", "value", "b", "value", "c", "value"
), x = c(NA, 1L, NA, 2L, NA, 3L)), .Names = c("name", "x"), row.names = c(NA,
-6L), class = "data.frame")
引用快于upvar
引用。
要查找,命令'time'是你的朋友:
variable
输出:
namespace eval toto {
proc cb_upvar {varname} {
upvar $varname var
incr var
}
proc cb_scoped {varname} {
incr $varname
}
proc cb_variable {varname} {
variable $varname
incr $varname
}
}
proc benchmark {cmd} {
set toto::totovar 1
time $cmd 100
puts -nonewline "[lindex $cmd 0] =>\t"
puts [time $cmd 20000000]
}
puts [info tclversion]
benchmark {toto::cb_scoped ::toto::totovar}
benchmark {toto::cb_variable totovar}
benchmark {toto::cb_upvar totovar}
Rem:需要大量的迭代才能获得一致的结果。