帮助重构此代码

时间:2010-08-26 06:42:21

标签: ruby if-statement

更新:更好的答案与重构无关,但与设置空键的默认值有关。看到第一个答案 - 非常感谢!

大家好,你会如何重构这个?

    if n=network_stats["b"]
      network_stats["b"] = n +1 
    else
      network_stats["b"]=1
    end

我有一种唠叨的感觉,这可以用两行完成

8 个答案:

答案 0 :(得分:5)

这是一个简短易读的oneliner:

network_stats["b"] = (network_stats["b"] || 0) + 1

更长但可能更具可读性和可扩展性(将来会添加更多案例)版本:

network_stats["b"] = case network_stats["b"]  
                       when nil then 0  
                       else network_stats["b"] + 1  
                     end  

更新: 作为一种好奇心,这可以解决:

 network_stats["b"] += 1 rescue network_stats["b"] = 1

我不会亲自使用它。

答案 1 :(得分:4)

# do this when network_stats is defined
network_stats.default= 0

# to increment the network stats
network_stats["b"] += 1

例如

>> (network_stats={}).default= 0
=> 0
>> network_stats["b"] += 1
=> 1
>> network_stats
=> {"b"=>1}

答案 2 :(得分:3)

network_stats [“b”] =(n == network_stats [“b”]?(n + 1):1)

希望这会有所帮助

欢呼声

sameera

PS:这是一个很好的代码重构网站

http://refactormycode.com/

答案 3 :(得分:3)

如果为nil,您可以使用|| =运算符来赋值:例如:

network_stats["b"] ||= 1

然后你确定network_stats["b"]的值有如此简单的增量1:

network_stats["b"] += 1

最终代码:

network_stats["b"] ||= 1
network_stats["b"] += 1

答案 4 :(得分:0)

network_stats["b"] = (n == network_stats["b"])? n+1 : 1

答案 5 :(得分:0)

我将假设您的代码中存在轻微的错误,并且您打算在第一行进行比较而不是分配,如下所示:

if n == network_stats["b"]
  network_stats["b"] = n + 1 
else
  network_stats["b"] = 1
end

我会将其重构为:

n == network_stats["b"] ? (network_stats["b"] = n + 1) : (network_stats["b"] = 1)

虽然基督徒的答案在使用的字节数方面更精确,但我发现它的可读性较差,但这只是个人意见。

如果他删除了答案,那就是:

network_stats["b"] = (n == network_stats["b"]) ? n + 1 : 1

答案 6 :(得分:0)

嘿明你应该知道三元运算符

我认为这可能会帮助你解决问题

network_stats [“b”] =(n == network_stats [“b”])? n + 1:1

答案 7 :(得分:0)

(network_stats ||= Hash.new(0))["b"] += 1