首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有人能给我解释一下这个Ruby方法吗?

有人能给我解释一下这个Ruby方法吗?
EN

Stack Overflow用户
提问于 2014-08-22 12:26:25
回答 4查看 98关注 0票数 0

有人能给我解释一下这个方法吗?如果我发送一个index as 4,code实际上返回什么?

代码语言:javascript
运行
复制
def getOffset(index)
    @baseIndex = 0 if @baseIndex.nil?
    raise IndexError if not \
           (@baseIndex ... @baseIndex + length) === index
    return index - @baseIndex
end

我无法理解第一行之后的部分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-22 13:30:26

清理代码

您的方法的第二行看起来非常混乱,让我们重构它:

代码语言:javascript
运行
复制
raise IndexError if not \
       (@baseIndex ... @baseIndex + length) === index

以上实际上是一行:

代码语言:javascript
运行
复制
raise IndexError if not (@baseIndex ... @baseIndex + length) === index

不应显式调用大小写相等操作符Range#===。相反,可以使用include?,这样做也是一样的:

代码语言:javascript
运行
复制
raise IndexError if not (@baseIndex ... @baseIndex + length).include?(index)

最后,可以将if not编写为unless,并删除一些空格:

代码语言:javascript
运行
复制
raise IndexError unless (@baseIndex...@baseIndex + length).include?(index)

好多了。

是干什么的呢?

让我们假设@baseIndex = 4length = 10

代码语言:javascript
运行
复制
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介于414之间(不包括14)。否则,它将继续下一行并返回index - @baseIndex

还有什么?

  • 方法名称和变量使用snake_case (@base_index)
  • 除非必要,否则不要写return
  • 避免使用getset前缀,即def offset通常就足够了
  • @base_index中初始化initializer (而不是在offset方法中): 初始化@base_index =0 end
  • 提取范围计算: def valid_range @base_index...@base_index + length end def偏移量(索引)提高IndexError,除非valid_range.include?(索引)索引- @base_index端
票数 5
EN

Stack Overflow用户

发布于 2014-08-22 12:32:27

代码语言:javascript
运行
复制
# 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

票数 1
EN

Stack Overflow用户

发布于 2014-08-22 12:44:13

===用于测试case语句的when子句中的相等性。

例如:

代码语言:javascript
运行
复制
(1...10) === 5 returns true.
(1...10) === 11 returns false.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25447024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档