ruby:rubocop 抱怨将 if else 转换为 case 语句

ruby: rubocop complains on converting if else to case statement

我有以下 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语句

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

但现在 rubocop 抱怨 Do not use empty case condition, instead use an if expression。有谁知道我的案例陈述有什么问题吗?

Ruby 希望您转换为匹配类型本身的 case。 Ruby 中的 case 不仅仅匹配相等。

形式的语句
case a
when b
  ...
end

案例将调用 b === a(注意这里的三重等于,not 表示相等)并在为真时触发 when 块。

===Object 上定义为等效于 ==,但许多 classes 覆盖它。

  • 正则表达式使用它来对 right-hand 侧
  • 进行模式匹配
  • Ranges 检查 right-hand 边是否包含在范围内
  • 类 检查 right-hand 端 is_a? 实例是否为 class.

这是 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 块自动知道这样做。