Ruby如何通过用户输入终止循环?附随机数生成循环问题求助
解决Ruby随机数生成循环无法停止的问题
嘿,作为Ruby新手遇到这个问题太正常啦!首先明确回答你:Ruby当然有break语句!不过你的代码问题不在有没有break,而是循环的逻辑设计出了问题,导致break根本没机会发挥作用😅
先帮你拆解下当前代码的核心问题:
- 你一开始用
gets.chomp阻塞程序等待输入,但输入后进入ran.each循环时,又在循环体里不断往ran数组添加新元素——这会导致each循环永远不会结束,因为数组一直在变长,遍历永远没尽头。 - 整个程序没有在生成随机数的过程中监听用户的停止指令,用户根本没法触发终止操作。
修正后的实现方案
我们可以用多线程拆分任务:一个线程负责持续生成随机数,另一个线程(主线程)监听用户输入,一旦用户按下任意键(回车确认),就终止生成线程,最后计算并输出结果。代码如下:
def generate_random_numbers random_numbers = [] puts "Press any key and hit Enter to stop the generation..." # 启动子线程负责生成随机数 generator = Thread.new do loop do # 生成0到1之间的随机浮点数(如果需要到1.1可以改回1.1) num = Random.rand(0.0...1.0) random_numbers << num puts num sleep(1) end end # 主线程等待用户输入,输入后终止生成线程 gets generator.kill generator.join # 确保生成线程完全停止 # 计算并输出结果 total_count = random_numbers.length average = total_count > 0 ? random_numbers.sum / total_count : 0.0 puts "\nThe total number of random numbers generated is: #{total_count}" puts "The average of the random numbers is: #{average.round(4)}" end generate_random_numbers
关于Ruby的break语句
如果是普通的循环场景,break可以直接终止循环,比如:
count = 0 loop do count += 1 puts "Count: #{count}" break if count == 5 # 当count等于5时终止循环 sleep(1) end
但你的场景需要响应用户的实时输入,单线程下gets会阻塞程序,导致随机数生成暂停,所以多线程是更合适的方案。
内容的提问来源于stack exchange,提问作者Renato
相关产品推荐
相关产品推荐

