Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 值范围和输出的动态映射_Ruby - Fatal编程技术网

Ruby 值范围和输出的动态映射

Ruby 值范围和输出的动态映射,ruby,Ruby,我正在尝试创建一种方法来计算包裹的运输成本。运输成本列在一个表格中,该表格说明了重量范围和相应的价格 示例数据: 0 - 50g : $1 51 - 100g : $2 我应该如何构造数据,如何根据数据动态生成价格,而不是编写许多if语句 示例代码: def price_for_weight(w) if w < 50 return 1 elsif w < 100 return 2 end 可以这样做的一种方法是将数据结构为散列,使用范围对象作为

我正在尝试创建一种方法来计算包裹的运输成本。运输成本列在一个表格中,该表格说明了重量范围和相应的价格

示例数据:

0 - 50g : $1
51 - 100g : $2
我应该如何构造数据,如何根据数据动态生成价格,而不是编写许多if语句

示例代码:

def price_for_weight(w)    
  if w < 50
    return 1
  elsif w < 100
    return 2
  end

可以这样做的一种方法是将数据结构为散列,使用范围对象作为键,如下所示:

SHIPPING_COSTS = {
  0..50 => 1,
  51..100 => 2,
}
在方法中使用Enumerableselect,然后可以使用===运算符获取键值对:

 def price_for_weight(w)    
    SHIPPING_COSTS.select { |range| range === w }
 end
===与集合一起使用询问比较右侧的值是否可以被视为左侧集合的成员请参见

由于上述操作将返回一个键值对,因此您可以在块之后添加.values.first以仅获取成本:

 def price_for_weight(w)    
    SHIPPING_COSTS.select { |range| range === w }.values.first
 end

可以这样做的一种方法是将数据结构为散列,使用范围对象作为键,如下所示:

SHIPPING_COSTS = {
  0..50 => 1,
  51..100 => 2,
}
在方法中使用Enumerableselect,然后可以使用===运算符获取键值对:

 def price_for_weight(w)    
    SHIPPING_COSTS.select { |range| range === w }
 end
===与集合一起使用询问比较右侧的值是否可以被视为左侧集合的成员请参见

由于上述操作将返回一个键值对,因此您可以在块之后添加.values.first以仅获取成本:

 def price_for_weight(w)    
    SHIPPING_COSTS.select { |range| range === w }.values.first
 end

假设成本并不总是整美元,以美分计算更好

ShippingCost = {50 => 100, 100 => 200}

def price_for_weight(w)
  ShippingCost[ShippingCost.keys.bsearch{|k| w <= k}]
end

假设成本并不总是整美元,以美分计算更好

ShippingCost = {50 => 100, 100 => 200}

def price_for_weight(w)
  ShippingCost[ShippingCost.keys.bsearch{|k| w <= k}]
end

还有一种方法可以做到这一点:

假设您的范围来自DB,那么您将使用一个数组。我们可以使用散列来表示每个价格范围的值,如下所示

prices = [ {min: 0, max: 50, price: 1}, {min: 50, max: 100, price: 2} ]
weight = 50.5

prices.find {|i| (i[:min]...i[:max]).include? weight }[:price]
#=> 2

还要注意。。。范围内,不包括结束值。因此,0…50将不包括50。如果使用了0..50、50..100,这将确保范围之间没有重叠,或者如果使用了0..50和51..100,我们不会跳过一个值范围。

还有一种方法可以做到这一点:

假设您的范围来自DB,那么您将使用一个数组。我们可以使用散列来表示每个价格范围的值,如下所示

prices = [ {min: 0, max: 50, price: 1}, {min: 50, max: 100, price: 2} ]
weight = 50.5

prices.find {|i| (i[:min]...i[:max]).include? weight }[:price]
#=> 2

还要注意。。。范围内,不包括结束值。因此,0…50将不包括50。如果您使用了0..50、50..100,这将确保范围之间没有重叠,或者如果您使用了0..50和51..100,我们不会跳过一个值范围。

大约30个类别,权重和价格之间没有直接关系,例如,应该能够为每个类别指定价格。旁注:在Ruby中,除非有一个表达式会提前终止方法的执行,否则不需要指定return。Ruby方法会自动返回上一个计算表达式的返回值。@sixty4bit谢谢,我只是喜欢看到return这个词,这给了我保证哈哈。如果重量为50.5g,价格是多少?@WandMaker很好!大约30个类别,权重和价格之间没有直接关系,例如,应该能够为每个类别指定价格。旁注:在Ruby中,除非有一个表达式会提前终止方法的执行,否则不需要指定return。Ruby方法会自动返回上一个计算表达式的返回值。@sixty4bit谢谢,我只是喜欢看到return这个词,这给了我保证哈哈。如果重量为50.5g,价格是多少?@WandMaker很好!作为预防措施,是否应该使用ShippingCost.keys.sort.bsearch{…}对键进行排序?成本只是范围的映射,因此我仍然可以使用1.01美元而不是整数centAs作为预防措施,是否应该使用ShippingCost.keys.sort.bsearch{…}对键进行排序?成本只是范围的映射,因此,我仍然可以使用1.01美元,而不是整数美分