Помогите рефакторинг этого кода - PullRequest
1 голос
/ 26 августа 2010

Обновление: гораздо лучший ответ не имеет ничего общего с рефакторингом, но имеет отношение к установке по умолчанию для пустых ключей. Смотрите первый ответ - большое спасибо, ребята!

Привет, ребята, как бы вы изменили это?

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

У меня есть ноющее чувство, что это можно сделать в 2 строки

Ответы [ 8 ]

5 голосов
/ 26 августа 2010

Это короткий и читаемый вкладыш:

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

Я бы не использовал это лично.

4 голосов
/ 26 августа 2010
# 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}
3 голосов
/ 26 августа 2010

Вы можете использовать оператор || = для присвоения значения, если ноль, например ::

network_stats["b"] ||= 1

Тогда вы уверены, что network_stats["b"] имеет значение столь простого приращения на 1:

network_stats["b"] += 1

Финальный код:

network_stats["b"] ||= 1
network_stats["b"] += 1
3 голосов
/ 26 августа 2010

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

надеюсь, это поможет

ура

sameera

PS: Это хороший сайт для рефакторинга кода

http://refactormycode.com/

0 голосов
/ 22 ноября 2010
(network_stats ||= Hash.new(0))["b"] += 1
0 голосов
/ 26 августа 2010

Эй, Мин, ты должен был знать о троичных операторах

Я думаю, это может помочь тебе обойти

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

0 голосов
/ 26 августа 2010

Я собираюсь предположить, что в вашем коде есть небольшая опечатка, и вы хотели сделать сравнение вместо присваивания в первой строке, например:

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
0 голосов
/ 26 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...