我正在制作一个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.
答案 0 :(得分:0)
如果您只需要为给定密钥写第一个值 - 请使用|| =
hash = {}
hash[:a] ||= 1 # => { a: 1 }
hash[:a] ||= 2 # => { a: 1 }
答案 1 :(得分:0)
使用新值替换给定键的值的哈希行为是哈希的预期行为。我们期望并需要哈希行为。
如前所述,您需要为每个密钥指定一个唯一的名称。您可以为形容词adjective1
,adjective2
等命名。如果要隐藏用户的数字,可以在显示的字符串中轻松删除它们。即使离开他们也许并不是那么糟糕。
似乎将每个词性作为一个数组实现,以便你有形容词[0]等,这是一个更好的设计,但对于MadLibs的用例,我不认为所以。与其他词类的实例相比,形容词之间没有任何共同之处。