在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
。
答案 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
返回nil
,nil.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