2010-08-26 2 views
1

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

Привет, ребята, как бы вы это сделали?

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

У меня есть мучительное чувство, это может быть сделано в 2-х линий

+0

я хочу назначить п, которые будут использоваться ниже , –

ответ

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} 
+0

Это лучший ответ, чем те, которые задавали ваш вопрос точно так, как было задано ... –

+0

# сделать это, когда определяется network_stats -> вы имеете в виду, когда НЕ определены? –

+0

@ming yeow. Поскольку вы не показывали, как/где network_stats был инициализирован, возможно, это был пустой хеш, как во второй части моего ответа, но, возможно, это был хэш, инициализированный из запроса базы данных, например. Каким бы способом это ни происходило, как только у вас есть хэш, называемый network_stats, вы устанавливаете значение по умолчанию равным 0. Вам нужно сделать это только раз, поэтому я предложил сделать это там, где он определен –

3

network_stats [ "B"] = (п == network_stats [ "Ъ"] (п + 1): 1)

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

приветствий

Sameera

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

http://refactormycode.com/

+0

Спасибо большое! = D Малая поправка: network_stats ["b"] = ((n = network_stats ["b"])? (N + 1): 1) –

+0

Это в основном тот же код, но только в одной строке. Существует более четкое двухлинейное решение. – lest

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 
+0

Я не думаю, что это опечатка, это довольно распространенное назначение + условное. – tokland

+0

yup, это не опечатка. =) это назначение + условное –

0

Эй Мин вы должны знать о трехкомпонентных операторов

Я думаю, что это может помочь вам получить вокруг

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

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 

Update: Как курьез, это может работать на:

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

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

+1

это здорово, спасибо! Я не знал, что этот случай возвращает фактический предмет. Ваш oneliner гораздо читабельнее, чем остальные –

+0

О случае: Все оценивается как выражение в Ruby: literal, вызовы методов, переменные. Даже структура управления, такая как случай или если имеет значение. Используйте эту рубиновую мощность ;-) –

3

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

network_stats["b"] ||= 1 

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

network_stats["b"] += 1 

Окончательный код:

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

Эй, да, спасибо за очень простой, эффективный ответ! –

0
(network_stats ||= Hash.new(0))["b"] += 1 
Смежные вопросы