我有一个整数值i和一个数组list,我想确定i是否是list上的有效索引值。显然我可以这样做:
i
list
if i >= 0 && i < list.length # Do something with list[i]... end
但是,对于“数组索引是否有效”的检查,有没有更好的Ruby习惯用法?
ovfsdjhp1#
我在处理adventofcode.com/2015/day/23时遇到了这个问题,它要求实现一个虚拟机,当指令指针超出其指令集的范围时,该虚拟机必须退出。虚拟机允许指令指针递增和递减,因此我们必须假设它也可以为负。在Ruby中,负数组索引从数组末尾开始计数,-1是最后一个元素,例如:
-1
ary = ["foo", "bar", "baz"] ary[-1] #=> "baz" ary[-2] #=> "bar" ary[-3] #=> "foo"
这意味着从-3到2的任何索引都被认为在ary的边界内。要排除负值,必须构建自己的检查,我可能会使用range来表示边界:(使用...代替..使其排除结尾)
-3
2
ary
...
..
bounds = 0...ary.size
现在可以在循环中处理指令,并通过include?检查指令指针:
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 <= ip和ip < bounds.end。
bound.begin <= ip
ip < bounds.end
1条答案
按热度按时间ovfsdjhp1#
我在处理adventofcode.com/2015/day/23时遇到了这个问题,它要求实现一个虚拟机,当指令指针超出其指令集的范围时,该虚拟机必须退出。
虚拟机允许指令指针递增和递减,因此我们必须假设它也可以为负。
在Ruby中,负数组索引从数组末尾开始计数,
-1
是最后一个元素,例如:这意味着从
-3
到2
的任何索引都被认为在ary
的边界内。要排除负值,必须构建自己的检查,我可能会使用range来表示边界:(使用
...
代替..
使其排除结尾)现在可以在循环中处理指令,并通过
include?
检查指令指针:在内部,它检查
bound.begin <= ip
和ip < bounds.end
。