Есть ли более короткая тройка для Ruby? - PullRequest
2 голосов
/ 25 февраля 2012

Это самое близкое, что я нашел, но оно имеет дело с логическими значениями вместо чисел: DRY up Ruby ternary

Я пытаюсь избежать сценария деления на 0 в Ruby, сохраняя при этом код короче и проще для чтения.

Я хочу сделать следующий фрагмент кода более кратким:

number_to_percentage ((percent_complete.nan? ? 0 : (percent_complete * 100)), :precision => 0)

или

number_to_percentage ((percent_complete.nan? ? 0 : percent_complete) * 100, :precision => 0)

Просто сейчас кажется, что это действительно трудно читать. Здесь задействовано больше цепочек, поэтому percent_complete на самом деле немного длиннее. Я также возвращаю это значение из метода, поэтому оно снова становится длиннее.

Я бы хотел избежать использования временных переменных или сокращения имен методов, поэтому надеялся узнать о другом способе.

Если я смогу избежать необходимости дважды вводить «процентов_компонента", то это в значительной степени решает ее.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2012

Почему бы вам не определить новый метод для Numeric?

class Numeric
  def safe_to_f
    self.nan? ? 0.0 : self.to_f
  end
end

Если хотите, вы также можете добавить:

class NilClass
  def safe_to_f
    0.0
  end
end

Вот еще одна идея:

class Object
  # substitute a different object if 'predicate' is true
  # if 'predicate' is :nil?, this is just like ||
  def guard(predicate,substitute)
    send(predicate) ? substitute : self
  end
end

Что позволит вам написать:

percent_complete.guard(:nan?, 0)
1 голос
/ 25 февраля 2012

Я бы просто добавил пользовательский помощник, который будет иметь дело с NaN желаемым образом.

# in app/helpers/extra_number_helper.rb
module ExtraNumberHelpers
    def number_or_nan_to_percentage(number, options = { })
        number = 0 if(number.respond_to(:nan?) && number.nan?)
        number_to_percentage(number, options)
    end
end

Затем используйте number_or_nan_to_percentage, когда вам нужна специальная обработка NaN. Это также имеет приятный побочный эффект: люди, работающие над вашим кодом, сообщают, что вы явно имеете дело с NaN в качестве возможного значения.

...