2

这是我发现的最接近的,但它处理的是布尔值而不是数字: DRY up Ruby ternary

我试图避免 Ruby 中除以 0 的情况,同时保持代码更短且更易于阅读。

我想让以下代码更简洁:

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实际上要长一些。我也从一个方法返回这个值,所以它又变长了。

我想避免使用临时变量或缩短方法名称,因此希望了解另一种方法。

如果我可以避免必须输入两次“percent_complete”,那么这几乎可以解决它。

4

2 回答 2

4

为什么不在 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)
于 2012-02-24T20:27:47.280 回答
1

我只需添加一个以所需方式处理 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 作为可能的值处理。

于 2012-02-24T22:29:12.440 回答