2015-04-29 2 views
0

Предположим, у меня есть Рубин заявление переключатель, как:Рефакторинг оператора Ruby, когда каждый случай оценивает одно значение?

x = 1 

case name 
    when "Bob" 
     a = x 
    when "Joe" 
     b = x 
    when "Tom" 
     c = x 
    ... 
end 

, что это лучший способ, чтобы реорганизовать, что в однострочника?

UPDATE: переименованные переменные, чтобы сделать его более ясным, к чему я становлюсь.

+1

не очень уверен, что вы имели в виду там, но вы можете сделать Hash как этот '{«Bob»=> 1,«Джо»=> 1,«Томь "=> 1, ..}' и использовать 'hash [key]' для получения значений – shivam

+1

Итак, в зависимости от определенного значения вы присваиваете что-то в разные переменные? У меня есть сильное чувство, что для этого требуется немного более высокий уровень рефакторинга, который влияет на код вне данного фрагмента. –

+0

@ D-side вы, возможно, были правы, я просто думал, что, поскольку в конце, какая бы ни была выбрана переменная, она равна той же ценности, что и у нее есть способ «рубиновой магии». – warchildx4

ответ

2

В вашем случае вы можете использовать метод eval, но это не «хороший способ» сделать это.

name = "Tom" 

a,b,c = [0]*3 
config = {"Joe" => "a", "Bob" => "b", "Tom" => "c"} 
x = 1 

eval("#{config[name]}=#{x}") 

puts a, b, c 
# => 0 
# => 0 
# => 1 
+0

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

+0

@ warchildx4 Хорошо, вы можете использовать это, но это не «приятно». –

+0

, а что если вместо 1 это была переменная, равная целому числу, поэтому каждый раз, когда для a, b или c установлено это значение, я обновляю свой код, чтобы показать, что я имею в виду. – warchildx4

0

Я бы не использовать отдельные переменные a, b и c, я бы создать results хэш и сохранить целевое значение в нем name:

results = {} 
results[name] = x 

и использовать соответствующий результат в моем более позднем коде.

+0

Проблема: a, b, c уже существуют и продолжают существовать впоследствии – warchildx4

+1

@ warchildx4 Вы спрашиваете о рефакторинге, и это абсолютно правильное предложение. Имея несколько переменных, подобных этому, совершенно неприятно, если возникает такая картина. Сопоставьте свою структуру данных, чтобы она соответствовала тому, как вы ее используете, а не наоборот. – tadman

+0

Вопрос заключается не в том, следует ли использовать три заданные переменные. Он также не требует лучшего способа присвоения значений переменным, чем использование приведенного примера case. Он просто спрашивает: «Каков наилучший способ реорганизации в однострочном пространстве?», Который я интерпретирую как гипотетический вопрос, «может ли это быть реорганизован как однострочный?». @ Лукас - единственный, кто решил этот вопрос. –

0

Возможно, возникли проблемы с рефакторингом case case в одну строку, так как все другие решения, которые вы видели до сих пор, определенно не одни.

Если ваш истинный вопрос заключается в том, как реорганизовать этот код (в отличие от того, чтобы перетащить его в одну строку), то создание экземпляра хэша, как указывали другие, станет для вас способом. Вам все еще нужно заявление if, чтобы вытащить ключи из этого хэша. Так что, возможно, что-то вроде:

name = "Tom" 
people = {"Tom" => 1, "Bob" => 1} 
if name == "Tom" 
    puts people.fetch("Tom") # Results in 1 
end 

Если имя каждого будет равна 1, хотя, вы могли бы сделать что-нибудь неприятное, как это:

if name == "Tom" || name == "Bob" || name == "Harry" then a = 1 end 

Опять же, это немного непонятно, что вы ищете в противном случае вы могли бы получить от нас более качественные ответы, пытаясь помочь. Имеет ли значение назначение букв хотя (например, a = 1 необходим против b = 1)? Если это так, это может изменить ответ.

Просьба уточнить ваш вопрос, если это не поможет вам на 100%.

+0

существует разница между a и b, и каждый из них прикреплен к соответствующей строке. – warchildx4

+0

Если вам нужно сделать несколько объявлений (например, a = 1, b = 1 и т. Д.), А также проверить наличие нескольких условий (например, «имя» Tom? Bob? Etc?), Вы можете начать чувствовать что все это в одной строке довольно грязно. Когда вы думаете о рефакторинге, вы должны думать о логике очистки/конденсации, и здесь не так много логики для конденсации. –

1

Я не защищаю следующее, но вы спросили, можно ли повторить утверждение вашего дела как однострочный. Это решение требует, чтобы x быть ни nil, ни false:

x = 1 

name = "Bob" 
(name=="Bob" && a=x) || (name=="Velma" && b=x) || (name=="Luigi" && c=x) 
a #=> 1 
b #=> nil 
C#=> nil 

name = "Velma" 
(name=="Bob" && a=x) || (name=="Velma" && b=x) || (name=="Luigi" && c=x) 
a #=> nil 
b #=> 1 
C#=> nil 

name = "Luigi" 
(name=="Bob" && a=x) || (name=="Velma" && b=x) || (name=="Luigi" && c=x) 
a #=> nil 
b #=> nil 
C#=> 1 

name = "Olivia" 
(name=="Bob" && a=x) || (name=="Velma" && b=x) || (name=="Luigi" && c=x) 
a #=> nil 
b #=> nil 
C#=> nil 
Смежные вопросы