Ruby有三个更短的三元组吗?

时间:2012-02-24 20:11:21

标签: ruby-on-rails ruby ternary

这是我发现的最接近但它处理布尔值而不是数字: 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”,那么几乎可以解决它。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

当您需要特殊的NaN处理时,请使用number_or_nan_to_percentage。这也有一个令人愉快的副作用,就是告诉处理代码的人,你明确地将NaN作为可能的值处理。