代码之家  ›  专栏  ›  技术社区  ›  Matteo Italia

是否有更好的方法从某个索引到结尾获取可能为空的数组切片/范围?

  •  1
  • Matteo Italia  · 技术社区  · 6 年前

    在鱼阵范围内,是一个基础,包括两个极端,即: unsurprisingly ,在可能需要零长度范围时会导致问题。

    尤其是,我正处于这样一种情况下,我为自己的消费划分出第一个论点,我想把其余的论点转发出去——这可能不是什么!-命令。如果这是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 会出人意料地 也。这是因为 -1 实际上扩展到某个影响 (count $argv) ,因此上面的语句等价于

    set -l other_args $argv[2..1]
    

    它是从不存在的元素2到存在的元素1的倒转范围, 包容的 最终变成了平原 $argv[1] .

    为了避免这个问题,目前我正在使用这个可怕的解决方法

    set -l other_args $argv[2..(expr (count $argv) + 1)]
    

    确保最后一个索引是 一次过去 最后一个,强制范围是一个“直”的范围,尽管可能完全超出范围(根据需要返回一个空列表)。

    然而,我想知道:有没有一个更好的解决方案我错过了?

    1 回复  |  直到 6 年前
        1
  •  3
  •   faho    6 年前

    然而,我想知道:有没有一个更好的解决方案我错过了?

    升级至3.0。这是2.7中修复的错误。

    现在的工作方式是,如果一个范围中只有一个指数是负的,那么它总是被解释为两个指数中的较大者,因此如果是负的,迭代就必须继续进行。

    如果索引实际上不是更大的,那么这不会导致任何元素,这正是您在这里想要的。