有人能给我解释一下这个方法吗?如果我发送一个index as 4,,code实际上返回什么?
def getOffset(index)
@baseIndex = 0 if @baseIndex.nil?
raise IndexError if not \
(@baseIndex ... @baseIndex + length) === index
return index - @baseIndex
end我无法理解第一行之后的部分。
发布于 2014-08-22 13:30:26
清理代码
您的方法的第二行看起来非常混乱,让我们重构它:
raise IndexError if not \
(@baseIndex ... @baseIndex + length) === index以上实际上是一行:
raise IndexError if not (@baseIndex ... @baseIndex + length) === index不应显式调用大小写相等操作符Range#===。相反,可以使用include?,这样做也是一样的:
raise IndexError if not (@baseIndex ... @baseIndex + length).include?(index)最后,可以将if not编写为unless,并删除一些空格:
raise IndexError unless (@baseIndex...@baseIndex + length).include?(index)好多了。
是干什么的呢?
让我们假设@baseIndex = 4和length = 10
raise IndexError unless (@baseIndex...@baseIndex + length).include?(index)
# is evaluated as:
raise IndexError unless (4...4 + 10).include?(index)
# is evaluated as:
raise IndexError unless (4...14).include?(index)它引发IndexError,除非index介于4和14之间(不包括14)。否则,它将继续下一行并返回index - @baseIndex。
还有什么?
snake_case (@base_index)returnget和set前缀,即def offset通常就足够了@base_index中初始化initializer (而不是在offset方法中):
初始化@base_index =0 end发布于 2014-08-22 12:32:27
# this sets the base index to 0 unless `@baseIndex` is defined
@baseIndex = 0 if @baseIndex.nil?
# this raises an error if the index you passed in is larger than the size of your array
raise IndexError if not (@baseIndex ... @baseIndex + length) === index
# this returns the offset
return index - @baseIndex因此,如果您没有设置@baseIndex并传递4,此方法将返回4。
如果将@baseIndex设置为2,则此方法将返回2。
如果将@baseIndex设置为5,则此方法将返回IndexError。
发布于 2014-08-22 12:44:13
===用于测试case语句的when子句中的相等性。
例如:
(1...10) === 5 returns true.
(1...10) === 11 returns false.https://stackoverflow.com/questions/25447024
复制相似问题