在Ruby中使用范围作为键

时间:2015-06-21 20:06:38

标签: ruby range

我有一个使用范围作为键的哈希表。

getApplicationContext()

为什么不返回hash = { 1..10 => "Foo", 11..20 => "Bar", 21..30 => "Baz", 31..40 => "Quux", } hash.find {|key, value| key == 5} # => `nil`

编辑:

如下所述,将Foo更改为Hash

3 个答案:

答案 0 :(得分:2)

使用==检查是否存在真正的相等性,而5则不是范围。但您可以使用===include?。您也可以尝试select而不是find

示例:

hash = {
  1..10 => "Foo",
  11..20 => "Bar",
  21..30 => "Baz",
  31..40 => "Quux",
}

p hash.find {|key, value| key === 5}       #[1..10, "Foo"]
p hash.find {|key, value| key.include?(5)} #[1..10, "Foo"]
p hash.select{|key, value| key === 5}      #{1..10=>"Foo"}
p hash.select{|key, value| key.include?(5)}#{1..10=>"Foo"}

请查看不同的结果。 find返回一个数组,`选择一个哈希。

结束语:您使用了Hash = ...。我希望这是一个错字,你想使用hash

答案 1 :(得分:1)

case when构造旨在实现此目的。

x = 5
p case x
  when 1..10  then "Foo"
  when 11..20 then "Bar"
  when 21..30 then "Baz"
  when 31..40 then "Quux"
end

# => "Foo"

答案 2 :(得分:0)

对于您的具体示例,您可以使用

Traceback (most recent call last): 
  File "D:/My Projects/BlackJack.py", line 164, in <module>
    main()
  File "D:/My Projects/BlackJack.py", line 150, in main
    number = games.ask_number("How many players? (1 - 7): ", low=1, high=8)
  File "D:/My Projects/games.py", line 21, in ask_number
    response = int(input(question))
ValueError: invalid literal for int() with base 10: 's'

例如,如果Hash[(k-1)/10]

k = 15

对于一般情况,如果速度很重要,首先构造另一个哈希:

Hash[(15-1)/10] => Hash[1] => "Bar"

所以你可以只查找值:

H=Hash.flat_map { |r,v| r.to_a.product([v]) }.to_h
  #=> { 1=>"Foo" ,  2=>"Foo" ,..., 10=>"Foo",
  #    11=>"Bar" , 12=>"Bar" ,..., 20=>"Bar",
  #    ...
  #    31=>"Quux", 32=>"Quux",..., 40=>"Quux"}