代码无效,我不知道为什么。我认为它看起来不错。也许我还不懂语言,需要循环使用words.each和redacted.each部分? Ruby很难! 谢谢你的帮助!
puts "Write something: "
text = gets.chomp
text.downcase!
puts "Redact some words: "
redact = gets.chomp
redact.downcase!
words = text.split(" ")
redacted = redact.split(" ")
redacted_text = ""
words.each do |word| #I think the problem happens starting here
redacted.each do |wordtoredact|
unless redacted.include?(word)
puts "No redactable word(s) found."
end
do
if word == wordtoredact #is this right?
redacted_text = redacted_text + "REDACTED "
else
redacted_text = redacted_text + "#{word}"
end
end
puts redacted_text
编辑:此代码的要点是将字符串作为输入并编辑某些单词。然后使用编辑的单词重新打印原始字符串。 编辑2:我发表评论,我认为可能是问题所在。 编辑3:当我输入这两个输入时会发生什么:
Write something:
hello my name is Bob
Redact some words:
hello bob
No redactable word(s) found.
No redactable word(s) found.
No redactable word(s) found.
No redactable word(s) found.
No redactable word(s) found.
No redactable word(s) found.
REDACTED hello my my name name is is bob REDACTED
如果那里有可编辑的单词,为什么不会发生可编辑的话?为什么redacted_text对象会打印每个单词两次。我的循环机制有问题吗?
答案 0 :(得分:2)
看起来你对块语法有点困惑。查看this参考。
我相信这是你想要完成的事情。出于某种原因,Ruby中的所有内容都比最初看起来更容易:D
puts "Write something: "
text = gets.chomp.downcase # I chained downcase here. It's simpler :D
puts "Redact some words: "
redact = gets.chomp.downcase # Here too, same reason
words = text.split(" ")
redacted = redact.split(" ")
redacted_text = ""
words.each {|word| # Check for each word if it should be redacted
if redacted.include?(word)
#It should, redact it!
redacted_text = redacted_text + "REDACTED "
else
#Nope, this word is fine!
redacted_text = redacted_text + "#{word} "
end
}
puts redacted_text
您不需要明确表示要与编辑列表中的每个单词进行比较,因为包含已经这样做了。您还应该检查如何使用.each。 如果方法调用很简单,你就不需要括号。 所以你可以写:
text.split " "
而不是:
text.split(" ")
起初这对我来说很奇怪,因为我带着C ++背景来到Ruby。但是现在我尽可能使用简化版本。
答案 1 :(得分:0)
在@ SlySherZ的回复基础上,您还可以使用map
代替each
puts "Write something: "
text = gets.chomp.downcase # I chained downcase here. It's simpler :D
puts "Redact some words: "
redact = gets.chomp.downcase # Here too, same reason
words = text.split(" ")
redacted = redact.split(" ")
redacted_text = words.map{|word| redacted.include?(word) ? "REDACTED" : word }.join(" ")
puts redacted_text
答案 2 :(得分:0)
如果您考虑问题 - 从字符串中删除某些模式 - 最容易用正则表达式解决(不需要拆分字符串并自行循环)。这就是我的意思:
def remove_words(str, word_list)
regexps = word_list.map {|word| /#{word}/}
regexp = regexps.join('|')
str.gsub(regexp, 'REDACTED')
end
好吧,但这一切意味着什么?好吧,首先我们为每个编辑的单词构建一个正则表达式字符串。第二行构建了一个巨大的正则表达式,第三行实际上取代了。
答案 3 :(得分:0)
您是否收到错误消息,表明您错过了代码中的“结束”?那里你需要4个。
这是我对它的尝试,我检查每个wordtoredact以查看它是否与word匹配,同时将i变量添加为迭代器。当你遍历每个可编辑的单词时,我将等于编辑的长度,并将正常的单词添加到你的数组中。它在迭代所有单词时执行此操作,然后在最后连接并显示最终数组。
final_string = Hash.new
words.each do |word|
i = 1
redacted.each do |wordtoredact|
if word == wordtoredact
final_string << "REDACTED"
break
elsif i == redacted.length
final_string << word
end
i+=1
end
end
puts final_string.join(" ")