有没有更好的方法来获取从某个索引到末尾的可能为空的数组 slice/range ?
Is there a better way to get a possibly-empty array slice/range from some index to the end?
在 fish 数组中,范围是基于一个的并且包括两个极端,unsurprisingly,这会在需要可能为零长度的范围时导致问题。
特别是,我处于这样一种情况,我把第一个参数拆分出来供自己消费,我想转发其余的——可能是none! - 一些命令。如果这是 Python,我可以这样做:
my_arg = sys.argv[1]
other_args = sys.argv[2:]
然而,不幸的是,将其直接翻译为 fish 在边缘情况下不起作用;考虑
set -l my_arg $argv[1]
set -l other_args $argv[2..-1]
(我保留了相同的索引,而在 fish 中索引是基于 1 的,$argv
不包括 sys.argv[0]
)
只要有足够的参数,这就可以正常工作;例如,如果我使用参数 a b c d e
调用我的命令,我将得到 $my_arg = a
和 $other_args = b c d e
.
但是,如果我只用 a
调用它,other_args
也会令人惊讶地设置为 a
。这是因为 -1
实际上被扩展为 (count $argv)
的效果,所以上面的语句等同于
set -l other_args $argv[2..1]
这是从 none存在的元素 2 到存在的元素 1 的倒置范围,包括,归结为普通 $argv[1]
。
为了避免这个问题,目前我正在使用这个糟糕的解决方法
set -l other_args $argv[2..(expr (count $argv) + 1)]
这确保最后一个索引是 过去 最后一个,迫使范围成为 "straight" 一个,尽管可能完全超出范围(returns 一个空列表。
但是,我想知道:是否有更好的解决方案我还缺少?
However, I'm wondering: is there a better solution that I'm missing?
升级到 3.0。这是 2.7 中的一个错误,已在那里修复。
现在的工作方式是,如果一个范围内只有一个索引为负,它将始终被解释为两者中较大的一个,因此在负数结束时,迭代将被迫向前推进.
如果索引实际上并没有变大,这将导致没有元素,这正是您在这里想要的。
在 fish 数组中,范围是基于一个的并且包括两个极端,unsurprisingly,这会在需要可能为零长度的范围时导致问题。
特别是,我处于这样一种情况,我把第一个参数拆分出来供自己消费,我想转发其余的——可能是none! - 一些命令。如果这是 Python,我可以这样做:
my_arg = sys.argv[1]
other_args = sys.argv[2:]
然而,不幸的是,将其直接翻译为 fish 在边缘情况下不起作用;考虑
set -l my_arg $argv[1]
set -l other_args $argv[2..-1]
(我保留了相同的索引,而在 fish 中索引是基于 1 的,$argv
不包括 sys.argv[0]
)
只要有足够的参数,这就可以正常工作;例如,如果我使用参数 a b c d e
调用我的命令,我将得到 $my_arg = a
和 $other_args = b c d e
.
但是,如果我只用 a
调用它,other_args
也会令人惊讶地设置为 a
。这是因为 -1
实际上被扩展为 (count $argv)
的效果,所以上面的语句等同于
set -l other_args $argv[2..1]
这是从 none存在的元素 2 到存在的元素 1 的倒置范围,包括,归结为普通 $argv[1]
。
为了避免这个问题,目前我正在使用这个糟糕的解决方法
set -l other_args $argv[2..(expr (count $argv) + 1)]
这确保最后一个索引是 过去 最后一个,迫使范围成为 "straight" 一个,尽管可能完全超出范围(returns 一个空列表。
但是,我想知道:是否有更好的解决方案我还缺少?
However, I'm wondering: is there a better solution that I'm missing?
升级到 3.0。这是 2.7 中的一个错误,已在那里修复。
现在的工作方式是,如果一个范围内只有一个索引为负,它将始终被解释为两者中较大的一个,因此在负数结束时,迭代将被迫向前推进.
如果索引实际上并没有变大,这将导致没有元素,这正是您在这里想要的。