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