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
块自动知道这样做。
我有以下 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
块自动知道这样做。