Я нашел этот вопрос, потому что я искал оператор case
для нескольких переменных, но, пройдя через следующее, пришел к выводу, что необходимость сравнения нескольких переменных может указывать на необходимость другого подхода.(Я вернулся к своему собственному коду с этим выводом и обнаружил, что даже Hash помогает мне писать код, который легче понять.)
В Gems сегодня используется «без патчей обезьян» в качестве продажипункт .Переопределение оператора, вероятно, не правильный подход.Исправления для обезьян отлично подходят для экспериментов, но слишком легко ошибиться.
Кроме того, существует множество проверок типов.На языке, который разработан для Duck Typing, это ясно указывает на необходимость другого подхода.Например, что произойдет, если я передам целочисленные значения вместо числа с плавающей запятой?Мы получили бы «N / A», хотя это вряд ли то, что мы ищем.
Вы заметите, что пример, приведенный в вопросе, трудно прочитать.Мы должны быть в состоянии найти способ более четко представить эту логику читателю (и автору, когда они снова через несколько месяцев снова пересматривают код и должны ломать голову над тем, что происходит).
Инаконец, поскольку существует несколько чисел со связанной логикой, создается впечатление, что по крайней мере один класс значения -типа класса (Deposit
) хочет записаться.
Для чистоты яПредположим, что nil
APR можно считать 0,0% годовых.
class Deposit
def initialize(amount, unit='USD', options={})
@amount = amount.to_f # `nil` => 0.0
@unit = unit.to_s # Example assumes unit is always present
@apr = options.fetch(:apr, 0.0).to_f # `apr: nil` => 0.0
end
end
Как только у нас будет наш объект Deposit, мы сможем реализовать логику печати, не требуя операторов case
.
class Deposit
# ... lines omitted
def to_s
string = "#{@amount} #{@unit}"
string << ", #{@apr * 100.0}% APR" if @apr > 0.0
string
end
end
d = Deposit.new(656.00, 'rupees', apr: 0.065)
d.to_s
# => "656.0 rupees, 6.5% APR"
e = Deposit.new(100, 'USD', apr: nil)
e.to_s
# => "100.0 USD"
f = Deposit.new(100, 'USD')
f.to_s
# => "100.0 USD"
Заключение : Если вы сравниваете несколько переменных в выражении case, используйте это как запах, чтобы предложить более глубокую проблему проектирования.Множественная переменная case
может указывать на наличие объекта, который нужно создать.