如何阻止散列键覆盖 ruby 中的重复项
How can I stop a hash key from overwriting duplicates in ruby
我正在做一个狂欢;在段落中,它会找到看起来像这样的单词:[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.
如果您只需要为给定键写入第一个值 - 使用 ||=
hash = {}
hash[:a] ||= 1 # => { a: 1 }
hash[:a] ||= 2 # => { a: 1 }
哈希将给定键的值替换为新值的行为是哈希的预期行为。我们期望并需要哈希以这种方式运行。
正如之前其他人所说,您需要为每个键指定一个唯一的名称。您可以将形容词命名为 adjective1
、adjective2
等。如果您想对用户隐藏数字,您可以轻松地在显示的字符串中删除它们。甚至把它们留在里面可能也不是那么糟糕。
似乎将词性的每个部分实现为一个数组,这样您就有形容词 [0] 等,这是一个更好的设计,但对于 MadLibs 用例,我不这么认为。形容词之间的共同点并不比它们与其他词类的实例之间的共同点更多。
我正在做一个狂欢;在段落中,它会找到看起来像这样的单词:[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.
如果您只需要为给定键写入第一个值 - 使用 ||=
hash = {}
hash[:a] ||= 1 # => { a: 1 }
hash[:a] ||= 2 # => { a: 1 }
哈希将给定键的值替换为新值的行为是哈希的预期行为。我们期望并需要哈希以这种方式运行。
正如之前其他人所说,您需要为每个键指定一个唯一的名称。您可以将形容词命名为 adjective1
、adjective2
等。如果您想对用户隐藏数字,您可以轻松地在显示的字符串中删除它们。甚至把它们留在里面可能也不是那么糟糕。
似乎将词性的每个部分实现为一个数组,这样您就有形容词 [0] 等,这是一个更好的设计,但对于 MadLibs 用例,我不这么认为。形容词之间的共同点并不比它们与其他词类的实例之间的共同点更多。