处理多个if / else语句的更好方法是什么?

时间:2016-04-07 23:50:00

标签: ruby

在Ruby中有更好的方法吗?

if params.has_key?(:comentario_page)
  gon.position = 0
elsif params.has_key?(:avaliacao_page)
  gon.position = 1
elsif params.has_key?(:seguindo_page)
  gon.position = 2
elsif params.has_key?(:seguidores_page)
  gon.position = 3
[and go on...]
else 
  gon.position = 0
end

我们说我有10 if / else

6 个答案:

答案 0 :(得分:3)

假设keys是给定键的数组:

keys = [:comentario_page, :avaliacao_page, :seguindo_page, :seguidores_page]

然后你可以写:

def gon_position(keys, params)
  keys.index { |k| params.has_key?(k) }.to_i
end

请注意,如果index返回nilnil.to_i #=> 0

例如:

params = { :a=>1, :avaliacao_page=>2, :seguindo_page=>3, :b=>4 }
gon_position(keys, params)
  #=> 1

params = { :a=>1, :b=>4 }
gon_position(keys, params)
  #=> 0

答案 1 :(得分:0)

您可能想要使用case声明。

http://ruby-doc.org/docs/keywords/1.9/Object.html#method-i-case

这里的an article解释了案例陈述是什么以及你可以用它做什么。

答案 2 :(得分:0)

显而易见的答案是使用case语句。不太明显的答案是使用没有比较器值的裸案例陈述;这是一个鲜为人知的语法选择,允许您在每个true案例中对false / when进行测试。

gon.position = case
               when params.has_key?(:a) then 1
               when params.has_key?(:b) then 2
               when params.has_key?(:c) then 3
               else 0
               end

我不喜欢剩下的重复(或者这种格式化风格的过度缩进),但我可能会重构我使用的任何方法,这导致我通过哈希键case首先,不要过多地讨论其余部分。

答案 3 :(得分:0)

无法对此进行全面测试,因为我没有使用params包含您的周围代码,但我使用简化哈希测试以下代码似乎有效:

key_set = [:key0, :key2, :key3, :key9]
gon.position = key_set.map.with_index { |k, i| i if params.has_key? k }.compact.first || 0

末尾的|| 0对应于所需的else值。

这假设所需的值是一个连续的整数。如果没有,请创建目标值的哈希key_hash以替换数组key_set,丢失.with_index,并将i if params.has_key? k替换为key_hash[k] if params.has_key? k

坏消息是这不会发生短路。它将遍历整个候选键集,即使它已经找到了。

答案 4 :(得分:0)

与@pjs类似,我会使用数据结构来保存我的。但是,我不清楚你实际上是在谈论序号。为此,我们可以使用哈希:

 pages = {:comentario_page => 1,
      :avaliacao_page => 2,
      .....
 }

这样,您可以根据传递的参数获取任何有意义的值。由于您使用的是类gon,因此可以将其实例化为

 gon = Gon.new(params)
 ...
 gon.position = [value]

Case语句和if / else结构在这里是不好的选择。

答案 5 :(得分:0)

keys = %i[comentario_page avaliacao_page seguindo_page seguidores_page ...]
gon.position =
case (keys & params.keys).first
when :comentario_page then 0
when :avaliacao_page then 1
when :seguindo_page then 2
when :seguidores_page then 3
...
else 0
end