我想要做的是,从文件中读取,在一行上输出文件的每一行,如果输出与匹配的输入不匹配,则转到同一行的下一行,例如:< / p>
文字档案:
hello
goodbye
yes
no
why
maybe
okay
tomorrow
代码:
def compare(input)
File.readlines('test.txt').each do |word|
if word == input
puts "Found a match! #{word} == #{input}"
else
loop do
puts "Comparing #{input} to #{word}" #<= Overwrite the current compared word, with the new compared word
$stdout.flush
end
end
end
end
我该如何正确地做到这一点?我相信我可以使用\r
删除该行但是当我添加\r
并运行它时输出:
Comparing why to word
Comparing why to word
Comparing why to word
Comparing why to word
Comparing why to word
Comparing why to word
Comparing why to word
我最接近的一个例子是,如果你复制@ Sculper的答案并在IRB
中运行
(1..5).each do |i|
print "test #{i}\r" # Courtesy of @Sculpur
$stdout.flush
sleep(1)
end
答案 0 :(得分:1)
如果要替换单行输出,则需要使用print
而不是puts
。例如:
(1..5).each do |i|
print "test #{i}\r"
$stdout.flush
sleep(1)
end
那就是说,我怀疑这个代码本身就能解决你的问题 - 你给出的示例输出表明你的代码陷入无限循环。正如Max所说,这是因为你的loop do
不仅是多余的(你已经在迭代从文件中收集的单词),但是没有退出条件 - 它永远不会停止。
loop do
puts "Comparing #{input} to #{word}"
$stdout.flush
end
应替换为:
print "Comparing #{input} to #{word}"
$stdout.flush
答案 1 :(得分:0)
我认为你的loop do
正在创造一个无限循环。我没有看到任何在这里添加循环的理由。另外,我认为您需要在chomp
变量上调用word
来删除尾随的换行符。
即。
def compare(input)
File.readlines('test.txt').each do |word|
word = word.chomp # removes training '\n' character
if word == input
puts "Found a match! #{word} == #{input}"
else
puts "Comparing #{input} to #{word}"
end
end
end
在您的代码中,您说puts "Comparing #{input} to #{word}"
会使用新的比较字覆盖当前比较的字词,但这不是真的。您根本没有在此处分配变量或更改应用程序状态 - 只需将某些内容记录到控制台即可。除非我不知道您使用$stdout.flush
采取的某种方法,否则我认为这是不必要的。
如果一切都失败了,一个好的调试方法是安装pry
或byebug
并在代码中放置一个断点。然后,您可以在运行时检查变量的值。
答案 2 :(得分:0)
尝试这样的事情:
def compare(input)
arr = File.read('test.txt').split("\n")
arr.each do |word|
print "Comparing #{word} -> #{input}\r"
$stdout.flush
sleep(1)
if word == input
puts "Successfully found match! #{word} -> #{input}"
exit
end
end
end
输出将全部在同一行,并将替换该单词。它并不完美,但它会起作用。关键是确保您的成功输出比测试输出更长。