在Ruby中编写此计算的最佳方法是什么?
amt = self.alt_inv - (self.alt_tax ? self.alt_tax : 0)
- (self.alt_freight ? self.alt_freight : 0)
- (self.misc1_amt ? self.misc1_amt : 0)
- (self.misc2_amt ? self.misc2_amt : 0)
Run Code Online (Sandbox Code Playgroud)
在Ruby中,如果某些东西不是nil,它将在布尔表达式中返回true,并在计算中返回其值.
我不是很好解释,但你可以这样做:
amt = alt_inv -
(alt_tax || 0) -
(alt_freight || 0) -
(misc1_amt || 0) -
(misc2_amt || 0)
Run Code Online (Sandbox Code Playgroud)
这是一种更简洁的方式来处理您最初使用的三元组.
编辑:
我实际上比Jed Schneider的答案更好.我不会在这里复制它,因为他的答案值得赞扬它的优雅.
由于amt是所有属性的总和与之间的差异alt_inv,您可以将推算相加,然后减去alt_inv.reduce提供一种干净的方式来做到这一点.在执行缩减之前compact删除任何nil值.
当然,在这种情况下,属性可以扩展到您的需求,甚至可以从数据动态创建,在现实生活中,显然我不会使用变量属性.
attributes = [alt_tax, alt_freight, misc1_amt, misc2amt]
amt = alt_inv - attributes.compact.reduce(:+)
Run Code Online (Sandbox Code Playgroud)
减少:http://apidock.com/ruby/Enumerable/reduce
紧凑:http://apidock.com/ruby/Array/compact
如果在创建对象时自动将对象的值初始化为0(如果构造函数中未提供这些值),则可能更清晰.否则,您需要在对象中的任何位置执行此类条件逻辑,这些值是必需的.你宁愿这样做吗?
amt = alt_inv - alt_tax - alt_freight - misc1_amt - misc2_amt
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
199 次 |
| 最近记录: |