我遇到了一个gem,它在这里做了我想要的,但我很好奇我是否可以在本地做到这一点。
例如:
> ruby some_file.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 ...
首先你需要打印一个标题。这可以通过puts
:
puts "Choose a fruit"
输出:
Choose a fruit
那么对于each
选项,您必须打印一个(以1为基础的)数字及其索引。后者可通过with_index
添加:
options = ['Apple', 'Orange', 'Kewi']
options.each.with_index(1) do |option, index|
puts "#{index}. #{option}"
end
输出:
1. Apple
2. Orange
3. Kewi
最后必须提示用户输入。您可以使用print
输出字符串而不添加换行符,然后调用gets
收集输入:
print '> '
input = gets
输出:(▏
应该是游标)
> ▏
> h▏
h> hi▏
我> hi
输入
之后,将input
设置为"hin"
。注意,gets
将返回一个字符串,其中包括从输入的换行字符n
。
由于您对这里的数字输入感兴趣,因此可以使用to_i
将字符串转换为整数。另外,您可以loop
,直到值为between?
1和3(选项的数量):
loop do
print '> '
choice = gets.to_i
break if choice.between?(1, options.size)
puts 'Enter a value between 1 and #{options.size}'
end
的例子:
> 5
Enter a value between 1 and 3
> foo
Enter a value between 1 and 3
> 2
foo
被拒绝,因为to_i
对于非数字字符串返回0
,并且0不在1到3之间。
这应该让你开始。您可能希望将上述所有操作(打印标题、显示选项、收集输入)移动到一个方法中,该方法只返回用户的选择。最后,它可以这样工作:
fruit = select('Choose a fruit', ['Apple', 'Orange', 'Kewi'])
color = select('What color?', ['Green', 'Red'])
puts "Creating #{color} #{fruit}"