如果在Ruby中布尔值为true,那么将1添加到整数的最优雅的方法是什么?

时间:2017-04-28 22:02:24

标签: ruby-on-rails ruby

对于您来说这将是一个简单的问题Ruby专家:如果布尔值为true,将值1添加到整数的最优雅方法是什么?

例如,extra_unit是一个布尔值,我只想在total为真时才向extra_unit添加1。

total = unit_price * (units + (extra_unit ? 1 : 0 ))

这是最优雅的解决方案,在“优雅”中,我的意思是紧凑但仍然可读的代码?

1 个答案:

答案 0 :(得分:3)

鉴于我对上述问题的评论中有一点需要注意,如果我想把它放在一条线上并且不关心它对同事或未来自我的影响,我会做点什么像这样:

total = unit_price * (bonus ? units + 1 : units)

但是,实际上,它可以在不影响速度的情况下更详细地编写,这将提高可读性:

unit_price = 1.00
units = 1
bonus = true

unit_price * (units + (bonus ? 1 : 0 )) # => 2.0
unit_price * (bonus ? units + 1 : units) # => 2.0
multiplier = if bonus
              units + 1
            else
              units
            end
unit_price * multiplier # => 2.0

这些都返回相同的值,因此它们在结果中是等效的。

运行一些基准:

require 'fruity'
compare do
  t1 {unit_price * (units + (bonus ? 1 : 0 ))}
  t2 {unit_price * (bonus ? units + 1 : units)}
  t3 {
    multiplier = if bonus
                  units + 1
                else
                  units
                end
    unit_price * multiplier
  }
end

# >> Running each test 65536 times. Test will take about 2 seconds.
# >> t2 is similar to t1
# >> t1 is similar to t3

我多次运行基准测试,并且位置会交换,t3稍微慢一点,但不足以让Fruity一直标记它。

所以,就优雅而言,坚持认为它是神秘的或尽可能小的并不一定会给我们带来任何有用的东西,所以转而选择并且仍然很快。根据经验,如果您追求优雅,基准是至关重要的;当我认为某些内容会更快时,我常常感到惊讶,因为它比较简洁,相比之下,另一个更冗长的表达围绕着它旋转。