我正在努力改进我的 Ruby 代码,特别是在每个 Ruby 习惯用法的样式方面。我有以下方法:
def self.carnivore_convert
lambda do |value, field|
diet_type = value
if field[:header].to_s == 'diet'
diet_value = value.to_s.downcase
if diet_value =~ /yes|no/
diet_value == 'yes' ? diet_type = 'Carnivore' : diet_type = ''
end
end
diet_type
end
end
Rubocop 对此抱怨,说我应该:
“避免超过 2 层的块嵌套。”
它专门指的是这一行:
diet_value == 'yes' ? diet_type = 'Carnivore' : diet_type = ''
但是,我根本不清楚为什么这是“违反样式”,我为“修复”这件事所做的任何事情似乎都会使代码更加混乱,至少在我看来是这样。
当我说我不明白为什么这是一种风格违规时,我明白 Rubocop 显然觉得我不应该有一个if...if...if
排序结构。但我不确定为什么这是错误的。
我在想我也许可以通过使用某种保护子句来摆脱这段代码中的第一个 if 条件,但我不能这样做,因为这样我的代码就不起作用了。例如,我像这样更改了我的代码:
def self.carnivore_convert
lambda do |value, field|
diet_type = value
next unless field[:header].to_s == 'diet'
diet_value = value.to_s.downcase
if diet_value =~ /yes|no/
diet_value == 'yes' ? diet_type = 'Carnivore' : diet_type = ''
end
diet_type
end
end
但是,虽然没有出错,但这确实使代码无法按预期工作。我试过了break
,return
而不是next
。
所以我不确定如何将这段代码变成 Rubocop 不会抱怨的形状并且仍然可以阅读。作为一个附带问题,我觉得我在“Ruby 样式”上花费了很多时间,即使我的代码确实有效。只要我能理解为什么这种风格是违规的,我不介意,但在这里我很难看到它。话虽这么说,但我确实了解到,要建立对这些东西的直觉,我还有很长的路要走。
关于上述问题,有人有什么想法吗?