判断索引是否在给定数组范围内的Ruby习惯用法?

6rvt4ljy  于 2023-02-21  发布在  Ruby
关注(0)|答案(1)|浏览(129)

我有一个整数值i和一个数组list,我想确定i是否是list上的有效索引值。
显然我可以这样做:

if i >= 0 && i < list.length 
    # Do something with list[i]... 
end

但是,对于“数组索引是否有效”的检查,有没有更好的Ruby习惯用法?

ovfsdjhp

ovfsdjhp1#

我在处理adventofcode.com/2015/day/23时遇到了这个问题,它要求实现一个虚拟机,当指令指针超出其指令集的范围时,该虚拟机必须退出。
虚拟机允许指令指针递增和递减,因此我们必须假设它也可以为负。
在Ruby中,负数组索引从数组末尾开始计数,-1是最后一个元素,例如:

ary = ["foo", "bar", "baz"]

ary[-1] #=> "baz"
ary[-2] #=> "bar"
ary[-3] #=> "foo"

这意味着从-32的任何索引都被认为在ary的边界内。
要排除负值,必须构建自己的检查,我可能会使用range来表示边界:(使用...代替..使其排除结尾)

bounds = 0...ary.size

现在可以在循环中处理指令,并通过include?检查指令指针:

instructions = <<EOD.split("\n")
inc a
jio a, +2
tpl a
inc a
EOD

bounds = 0...instructions.size
ip = 0

while bounds.include?(ip)
  ins = instructions[ip]

  # do something with ins

  ip += 1
end

在内部,它检查bound.begin <= ipip < bounds.end

相关问题