Написать лучшую функцию переключения? - PullRequest
3 голосов
/ 02 апреля 2012

Я новичок в Ruby.
Как мне написать лучше для этой функции?Могу ли я использовать вместо этого хеш-таблицу.

def readable_status(status)
  if status == "1" 
    return "go"
  end
  if status == "2"
    return "stop"
  end
  if status == "3"
    return "die"
  end
end

Ответы [ 5 ]

8 голосов
/ 02 апреля 2012

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

def readable_status(status)
   readable = { "1" => "go", "2" => "stop", "3" => "die" }
   readable[status] || "default value"
end
6 голосов
/ 02 апреля 2012

Как насчет

def readable_status(status)
  %w{go stop die}[status.to_i - 1]
end
5 голосов
/ 02 апреля 2012

Я потерпел неудачу в попытках с 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
5 голосов
/ 02 апреля 2012

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

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

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

...
{'1' => 'go', '2' => 'stop', '3' => 'die'}[status]
1 голос
/ 02 апреля 2012

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

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

def readable_status(status)
  READABLE_STATUS_TABLE[status]
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...