在 Perl/Ruby 中,可以移动一个数组(类似于 Tcl 的列表),从而删除数组中的第一项并返回它。它的运行时间几乎是恒定的。即,对于 2 个元素和 200 万个元素也是如此。 在 Tcl 中是否有类似的东西?在某种程度上,它与 Tcl 的 lappend 项目相反。我们不是在顶部加 1,而是从底部删除一些东西。 代码应如下所示:
set k [ list 1 2 3 ]
puts [ shift k ]
> 1
puts [join $k ","]
> 2,3
当然,我可以在 proc 中执行此操作:
proc shift {list_name} {
upvar $list_name listy
set ret [lindex $listy 0]
set listy [lrange $listy 1 end ]
return $ret
}
我想知道是否有更好的方法。
最佳答案
(正如我在评论中所说)
有一个page about lshift在 tclers 维基。根据Tcl gems,与你的版本相比,使用lreplace 据说性能更好。页。
proc lshift listVar {
upvar 1 $listVar l
set r [lindex $l 0]
set l [lreplace $l [set l 0] 0]
return $r
}
关于list - 是否有与 Perl 的转变等效的 Tcl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40717074/