我有下面的if-else声明,rubocop抱怨了Style/CaseLikeIf: Convert if-elsif to case-when

if obj.is_a? Rest::Headers
  obj
elsif obj.is_a? Hash
  Rest::Headers.new(**obj)
elsif obj.is_a? Array
  Rest::Headers.new(**obj.to_h)
else
  raise 'Invalid object type for Headers!'
end

我把它转换成了案件陈述

case
when (obj.is_a? Rest::Headers)
  obj
when (obj.is_a? Hash)
  Rest::Headers.new(**obj)
when (obj.is_a? Array)
  Rest::Headers.new(**obj.to_h)
else
  raise 'Invalid object type for Headers!'
end

但现在鲁博科普抱怨了Do not use empty case condition, instead use an if expression次.有人知道我的案件陈述有什么问题吗?

推荐答案

Ruby希望您将其转换为与类型本身匹配的case.Ruby中的case不只是平等匹配.表格的陈述

case a
when b
  ...
end

case 将调用b === a(注意这里的三重相等,not表示相等),如果是真的,则触发when块.

===Object上定义为等同于==,但许多类会覆盖它.

  • 正则表达式使用它来匹配右边的模式
  • 范围判断右侧是否包含在范围内
  • 类判断右侧是否有is_a?个类实例.

这是Rubocop建议你使用的第三个要点.

case obj
when Rest::Headers
  obj
when Hash
  Rest::Headers.new(**obj)
when Array
  Rest::Headers.new(**obj.to_h)
else
  raise 'Invalid object type for Headers!'
end

请注意,我从来没有明确地在这里调用is_a?case街区自动知道该怎么做.

Ruby相关问答推荐

字符串长度多显示一个字符 - ruby

减少哈希值

类中的 Ruby 类(或模块中的模块)

在 Ruby 中,如何确定字符串是否不在数组中?

拆分 Ruby 字符串时如何保留分隔符?

Ruby 中的 STDIN 和 $stdin 有什么区别?

使用 Homebrew 安装 Ruby

Ruby 中的排序稳定吗?

判断 Ruby HTTP 响应是否成功

什么时候在 Ruby 中使用 Struct 比使用 Hash 更好?

如何仅从 Gemfile 中查看依赖关系树?

Ruby:module、require和include

如何在 Ruby 中创建私有类常量

Ruby NOT Rails 中有复数函数吗?

计算文件中的行数而不将整个文件读入内存?

如何理解 strptime 与 strftime

将字符串与Ruby中的数字连接起来

给定一组参数,如何将这些参数发送到 Ruby 中的特定函数?

Ruby 中的那些管道符号是什么?

如何在 Ubuntu 12.04 上正确安装 ruby​​ 2.0.0?