我想说的是
self.preferred_amount * object.each{|li|li.variant}.collect{|li|li.weight}
唯一的问题是某些权重等于零。
既然如此,我想补充一点,如果它们等于 nil,则使它们等于 0。
有什么办法可以将这个逻辑合并到同一行中吗?
或者有什么方法可以让这个声明比现在更加重构?
最佳答案
将 li.weight
更改为 li.weight || 0
||
是“短路或”运算符。如果其左侧为真(既非假也非零),则返回左侧,否则返回右侧。
MRI >= 1.8.7 中有一项功能可以让您简化此内容。而不是:
each{|li|li.variant}
你可以写
each(&:variant)
在 1.8.7 之前的 Ruby 版本中,需要向后移植 gem 才能获得此功能。
比这更好的是,将所有逻辑移动到对象的类中,例如
class Whatever
def variant_weights
each(&:variant).collect{ |li| li.weight || 0}
end
end
并使用它:
self.preferred_amount * object.variant_weights
但是请注意,将标量乘以数组是一个错误。如果您想对权重求和,则:
class Whatever
def total_variant_weights
each(&:variant).collect{ |li| li.weight || 0}.inject(&:+)
end
end
并使用它:
self.preferred_amount * object.total_variant_weights
关于ruby-on-rails - 如何在一行中写条件语句? rails ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4628401/