哈希重复

时间:2009-11-19 22:12:05

标签: ruby-on-rails ruby

我正在研究http://rubyquiz.com/quiz28.html,除了一个小虫子外几乎已经完成了。

在下面:提示是一个数组,为了参数起见,["one", "two", "three", "three", "four]

  def ask_reader(prompts)
    @answers = {}
    for p in prompts
      puts "Give me a #{p}"
      @answers[p] = gets.chomp
    end
  end

这很好用,我得到一个答案哈希与相应的答案,除了第二个答案[p]将覆盖第一个答案,因此只留下一个“三”的值。是否有良好的“红宝石”解决方法?感谢。

4 个答案:

答案 0 :(得分:4)

提示到值列表的地图如何:

提示1 => [“一”] prompt2 => [“二”] prompt3 => [“三”,“三”] 提示4 => [ “四”]

答案 1 :(得分:2)

两个明显的选择:

通过Array#zip

将原始提示数组与answers数组交叉引用
def ask_reader(prompts)
  prompts.inject([]) do |accu, p|
    puts "Give me a #{p}"
    accu << gets.chomp
    accu
  end
end

["one", "two", "two"].zip(["1", "2", "3"])
# => [["one", "1"], ["two", "2"], ["two", "3"]]

然后迭代:

[["one", "1"], ["two", "2"], ["two", "3"]].each do |(prompt, response)|
  puts "#{prompt}: #{response}"
end

或者,使用Hash Array值。

def ask_reader(prompts)
  prompts.inject({}) do |accu, p|
    puts "Give me a #{p}"
    (accu[p] ||= []) << gets.chomp
    accu
  end
end

答案 2 :(得分:0)

使用内部字段'prompt'作为键的某些包装器对象怎么样?

答案 3 :(得分:0)

更简单的方法。

a = %w[one two three four]
h = Hash.new { |hash, key| hash[key] =  a.find_index(key)+1}
p h["one"]
p h["three"]