2012-04-02 2 views

ответ

8

Если вы хотите использовать хэш (как на ваш вопрос) вы могли бы сделать :

def readable_status(status) 
    readable = { "1" => "go", "2" => "stop", "3" => "die" } 
    readable[status] || "default value" 
end 
+0

Значение по умолчанию - это круто !! –

+4

+1. Или 'readable.fetch (status," default_value ")', что может быть проще понять для кого-то нового для Ruby (я предпочитаю вашу версию). –

+0

Как мы можем использовать readable.fetch? –

5

уверен, просто используйте

def readable_status(status) 
    m = {'1' => 'go', '2' => 'stop', '3' => 'die'} 
    m[status] 
end 

вы можете сделать это Oneliner, если вы хотите:

... 
{'1' => 'go', '2' => 'stop', '3' => 'die'}[status] 
+1

Это хорошо, хотя я рекомендую (к рубин новичок OP), чтобы не только сделать хэш-константу, которая разыменовывается, когда значение хотела, но вместо того, чтобы оставить эту логику внутри метода обертки. Как говорит @karatedog, ваши потребности иногда меняются; если вы сохраните это в методе, вы можете изменить реализацию, чтобы использовать больше, чем просто хэш, не затрагивая другие области вашего кода. – Phrogz

6

Как насчет

def readable_status(status) 
    %w{go stop die}[status.to_i - 1] 
end 
+0

very nice :) +1 –

+0

Я думаю, что это не так хорошо, как это сделать код сложнее читать –

5

У меня возникли неудачные попытки с помощью Hash-es для этой проблемы из-за субоптимальной спецификации, которая была предоставлена ​​мне (что означает: бизнес изменил спецификацию во время разработки).

Хеши хороши, пока вам не нужно написать что-то более сложное, чем одно значение. Если вам нужно изменить эти одиночные значения на методы, вам нужно переписать все, так как хэши берут значение методов, вызывая их , когда определяется хэш. И если впоследствии значение возвращаемого метода изменится, хеши не будут изменены.

И остается читаемым на английском :-)

def readable_status(status) 
    case status 
    when "1" then "go" end 
    when "2" then "stop" end 
    when "3" then "die" end 
    end 
end 
1

Если хэш определяется внутри метода, хэш (и каждая строка в нем) воссоздан каждый метод вызывается. Определение константы предотвращает это; использование метода для доступа к значениям сохраняет гибкость, как сказал @Phrogz.

READABLE_STATUS_TABLE = {'1'=>'go', '2'=>'stop', '3'=>'die'} 

def readable_status(status) 
    READABLE_STATUS_TABLE[status] 
end 
Смежные вопросы