如何阻止哈希键覆盖ruby中的重复项

时间:2016-05-25 14:42:36

标签: ruby hashmap overwrite

我正在制作一个madlib;在段落中,它会找到如下所示的字词:[noun][verb][adjective]。它做得很好但是当我提示用户输入他们想要的那个位置时,它会用现有的密钥覆盖密钥(我猜是因为它们的名字相同)。但我不知道如何阻止它覆盖它;我试过合并,但我无法让它工作。

以下是代码:

class MadLib
  def initialize(input)
    p @input_string = read_file(input)
    p @parsed_inputs = parse(@input_string)
    p @hashed_input_values = {}
  end

  def take_input
    @parsed_inputs.each do |key|
      parse_key = key.match(/:/)

      if parse_key
        print "Enter #{parse_key.post_match} :"
        value = STDIN.gets.chomp
        @hashed_input_values["[#{key}]"] = value
        @hashed_input_values["[#{parse_key.pre_match}]"] = value
        @parsed_inputs.delete(parse_key.pre_match)
      else
        print "Enter #{key} :"
        @hashed_input_values["[#{key}]"] = STDIN.gets.chomp
      end
    end

    @hashed_input_values
  end

  def print_output
    @input_string.gsub(/\[(\w*:*\w)]/i, @hashed_input_values)
  end

  def parse(input)
    # f = File.open(input)
    input.scan(/\[(\w*:*\w)]/i).flatten
  end

  def read_file(file_name)
    file = File.read(file_name)
  end

  private :parse
end

madlib = MadLib.new(ARGV[0])

# test = "Story1.txt"
# madlib = MadLib.new(test)
madlib.take_input
puts "#{madlib.print_output}"

这是我一直在使用的文本文件:

Everyone was so [adjective] to [verb] all of the [adjective] animals. The star of the show was a [adjective] [noun] named Bobo.

2 个答案:

答案 0 :(得分:0)

如果您只需要为给定密钥写第一个值 - 请使用|| =

hash = {}
hash[:a] ||= 1 # => { a: 1 }
hash[:a] ||= 2 # => { a: 1 }

答案 1 :(得分:0)

使用新值替换给定键的值的哈希行为是哈希的预期行为。我们期望并需要哈希行为。

如前所述,您需要为每个密钥指定一个唯一的名称。您可以为形容词adjective1adjective2等命名。如果要隐藏用户的数字,可以在显示的字符串中轻松删除它们。即使离开他们也许并不是那么糟糕。

似乎将每个词性作为一个数组实现,以便你有形容词[0]等,这是一个更好的设计,但对于MadLibs的用例,我不认为所以。与其他词类的实例相比,形容词之间没有任何共同之处。