Ruby如何不依赖第三方gem原生实现命令行选项选择交互?
Ruby原生实现命令行交互方案
完全可以通过Ruby原生标准库实现你需要的多级选项选择、操作确认类命令行交互,不需要依赖任何第三方gem,核心仅使用内置的输入输出方法搭配简单的输入校验逻辑即可。
核心功能逻辑
- 枚举选项选择:循环输出带数字编号的选项列表,读取用户输入后做合法性校验,只有输入为列表内存在的有效编号时才返回对应选项值,无效输入提示用户重新输入
- 是/否确认:输出带[y/n]标识的确认提示,读取用户输入后做去空格、小写化处理,匹配y/yes返回确认通过,匹配n/no返回确认不通过,其他输入提示重输
完整可运行代码
# 通用选项选择方法 def select_option(prompt, options) loop do puts "\n#{prompt}" options.each_with_index { |opt, idx| puts "#{idx + 1}. #{opt}" } print "> " input = $stdin.gets&.strip if input&.match?(/^\d+$/) selected_index = input.to_i - 1 return options[selected_index] if selected_index.between?(0, options.size - 1) end puts "输入无效,请输入选项对应的数字编号" end end # 通用y/n确认方法 def confirm(prompt) loop do print "\n#{prompt} [y/n]?\n> " input = $stdin.gets&.strip&.downcase return true if %w[y yes].include?(input) return false if %w[n no].include?(input) puts "输入无效,请输入y(确认)或n(取消)" end end # 业务逻辑调用示例 if __FILE__ == $0 selected_fruit = select_option("Choose a fruit", ["Apple", "Orange", "Kewi"]) selected_color = select_option("What color?", ["Green", "Red"]) action_confirmed = confirm("Are you sure you want to create a #{selected_color} #{selected_fruit}") if action_confirmed puts "\nCreating #{selected_color} #{selected_fruit} ..." else puts "\n操作已取消" end end
运行效果
将代码保存为.rb文件后,执行ruby 文件名.rb即可得到和预期完全一致的交互流程:
Choose a fruit 1. Apple 2. Orange 3. Kewi > 1 What color? 1. Green 2. Red > 2 Are you sure you want to create a Red Apple [y/n]? > y Creating Red Apple ...
如果需要实现方向键切换选项、密码输入掩码、实时输入校验这类更复杂的终端交互,原生实现需要额外处理终端模式、转义序列,代码复杂度会明显提升;但你描述的编号选择、操作确认类基础交互,上述原生实现完全可以满足需求,无任何额外依赖。
内容的提问来源于stack exchange,提问作者Dante
相关产品推荐
相关产品推荐

