【问题标题】:How to avoid writing by hand a massive (switch) case, using a loop or a method如何避免使用循环或方法手动编写大量(开关)案例
【发布时间】:2021-03-12 20:16:15
【问题描述】:

我需要将每秒比特数设置为每秒兆比特的范围,问题是比特数从 1 bps 变为 7 Gbps,所以 case 表达式会很大,还有其他方法吗?也许使用循环或方法来避免手动编写所有案例?

                d = event.get("bps")
                f = d.round()

                result = case f
                   when 0..1000000 then 1
                   when 1000001..2000000 then 2
                   when 2000001..3000000 then 3
                   when 3000001..4000000 then 4
                   when 4000001..5000000 then 5
                end
                event.set("range_mbps", result)

【问题讨论】:

  • 对不起,我纠正了重叠和不连续性
  • 0比特为1兆比特有什么原因吗?

标签: ruby loops switch-statement


【解决方案1】:

您可以使用两种方法。

RANGE_SIZE = 1_000_000
def bit_to_range_id(n)
  return 1 if n.zero?
  ((n-1)/RANGE_SIZE) + 1
end
def range_id_to_range(id)
  return 0..RANGE_SIZE if id == 1 
  1+(id-1)*RANGE_SIZE..(id)*RANGE_SIZE
end
b = 36_500_000
id = bit_to_range_id(b)
  #=> 37 
range_id_to_range(id)
  #=> 36000001..37000000
b = 37_000_000
id = bit_to_range_id(b)
  #=> 37 
range_id_to_range(id)
  #=> 36000001..37000000 
b = 36_000_000
id = bit_to_range_id(b)
  #=> 36 
range_id_to_range(id)
  #=> 35000001..36000000 
b = 0
id = bit_to_range_id(b)
  #=> 1 
range_id_to_range(id)
  #=> 0..1000000 
b = 1_000_000
id = bit_to_range_id(b)
  #=> 1 
range_id_to_range(id)
  #=> 0..1000000 

【讨论】:

    【解决方案2】:

    一兆比特就是一百万比特,所以你可以简单地除以一百万:

    result = if f.zero? then 1 else (f-1) / 1_000_000 + 1 end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      相关资源
      最近更新 更多