2013-05-27 3 views
2

этот рубин код работает, но есть более обычный или упрощенный способ писать:более традиционным способом, чтобы написать этот рубин

options['host'] = begin 
    a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5' 
end 

Я просто чувствую, что код запах, но я не могу понять в теме.

Спасибо.

+1

Нет, это не пахнет, только вкус немного экзотичен. –

+2

@BorisStitnicky: Я бы сказал, что это использование 'begin..end' не очень распространено. –

ответ

4

Обычно символы используются в качестве хэш-ключей, потому что они save memory and are a little faster for comparisons и begin..end блок не является необходимым. Таким образом, становится:

options[:host] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5') 

Это сравнительно долгое время, в моей голове следующий разбирает проще:

options[:host] = 'doric-server5' 
options[:host] = 'jaxon-server16.jaxon.local' if a == :jaxon 

Итерация на вершине того, что у вас есть то, что, как представляется, полу- жестко закодированные значения (jaxon-server16.jaxon.local и doric-server5). Вы должны хранить их в константах или другой структуре данных, чтобы собрать их в одном месте. Например, если doric-server5 становится doric-server6 в один прекрасный день, вам нужно будет только изменить его в верхней части класса или файла. Кроме того, он упрощает чтение кода, поскольку теперь у них есть более гуманные имена того, что они представляют.

# somewhere else: 
JAXON_SERVER = 'jaxon-server16.jaxon.local' 
DORIC_SERVER = 'doric-server5' 

options[:host] = DORIC_SERVER 
options[:host] = JAXON_SERVER if a == :jaxon 

Поскольку мы имели дело с первоначальной мотивацией чтобы сделать его две линии, мы могли бы вернуться к одному, хорошо линия:

options[:host] = (a == :jaxon ? JAXON_SERVER : DORIC_SERVER) 

Если у вас есть много такого рода заявления, вы можете сделать хэш-код server, где, например, server[:jaxon] = 'jaxon-server16.jaxon.local', но если у вас всего две, две строковые константы в порядке.

В некоторых случаях лучше использовать параметр по умолчанию (в данном случае DORIC_SERVER), где бы оно не было по умолчанию для этого значения, вместо того, чтобы напрямую устанавливать значение по умолчанию для узла. Hash#fetch принимает два аргумента: ключ и значение по умолчанию, если этот ключ не существует.

options[:host] = JAXON_SERVER if a == :jaxon 

# somewhere else: 
options.fetch(:host, DORIC_SERVER) 

Без дополнительной информации трудно сказать, какой подход является лучшим в вашем случае.:-)

+0

Это был приятный ответ :) –

+0

Мне нравится эта строка - * Без дополнительной информации трудно сказать, какой подход лучше всего в вашем случае. *. Чтобы получить наилучший ответ, OP нужно будет больше работать в своем * вопросе *. –

+0

wow фантастический ответ. особенно, как использование выборки по умолчанию. – lukemh

6

Здесь не нужно begin..end.

options['host'] = a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5' 

Я бы поставил круглые скобки вокруг правой стороны. Не обязательно, просто для ясности.

options['host'] = (a == :jaxon ? 'jaxon-server16.jaxon.local' : 'doric-server5') 
+0

Со всем уважением я нашел другие достойные ответы Серхио, чтобы поддержать, но я не буду ни продвигать, ни ниспровергать это, поскольку блок «begin ... end» каким-то образом обращается ко мне, старый поклонник Pascal lanuage, лучше, чем последовательность '... = a ==: jaxon? ... 'Parenthesis действительно разъясняет это, хотя' begin ... end' все еще имеет свою магию. –

+1

@BorisStitnicky: да, Паскаль делает это людям :) –

+0

Люди утверждают, что несмотря на разительные различия, существует [глубокая связь между синтаксисом Pascal и Ruby] (http://www.bitwisemag.com/2/Delphi -For-Ruby-What-s-The), что может быть причиной того, что мне стало комфортно с Ruby в конце. –

2

Это еще один способ, чтобы написать его

options['host'] = case a 
when :jaxon 
    'jaxon-server16.jaxon.local' 
else 
    'doric-server5' 
end 

Он имеет гораздо больше строк, но я люблю его читаемости. Он также позволяет легко добавить несколько хостов:

options['host'] = case a 
when :jaxon 
    'jaxon-server16.jaxon.local' 
when :staging 
    'staging-server1' 
else 
    'doric-server5' 
end 
+0

В идеале, настройки, подобные этому, должны быть внешними для приложения. Они не должны быть в коде. –

+0

Это «правда». –

2

Если вы хотите, чтобы окружить его с чем-то для удобства чтения, вы можете поделиться парой скобок с помощью метода Hash#store.

options.store("host", 
    a == :jaxon ? "jaxon-server16.jaxon.local" : "doric-server5" 
) 
+0

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

Смежные вопросы