如何从控制台接受用户输入但不使用gets.chomp

时间:2015-02-19 17:28:07

标签: ruby string user-input gets

据我了解,接受用户输入的方式是

puts "Can you guess what number the computer is thinking of?"
userguess = gets.chomp

gets.chomp是一种字符串方法,因此如果用户输入数字5userguess会将值"5"存储为字符串。然后我必须做userguess.to_i!将其转换为int。但是,我不想这样做。我想以字符串或int接受用户输入,然后让程序执行以下操作:

if @guess.is_a?(Integer) == true
  puts "I got your number. Let me get back to you."
  # do something
elsif @guess.is_a?(Integer) == false
  puts "That's not a number. You MUST enter a number! Try again"
  # Ask the user to guess again.
else
  #something else
end

我不想明确地接受用户输入作为字符串,因为我想在程序中稍后检查它是字符串还是int。我该怎么做?

4 个答案:

答案 0 :(得分:0)

不,这是不可能的。

但是你可以定义一个小函数来检查该字符串是否可以是整数:

def is_i?(s)
  s.to_i.to_s == s
end

请注意,在这种情况下,带空格的字符串不是整数:

is_i? '123'    # true
is_i? '123 '   # false
is_i? ' 123'   # false
is_i? '12 123' # false

要处理第二个和第三个示例,您可以删除用户输入。

您的代码如下:

guess = gets.chomp.strip

if is_i? guess
  puts 'is integer' 
else
  puts 'is not an integer'
end

答案 1 :(得分:0)

这是不可能的。来自终端的所有用户输入都是字符串。如果有可能,您认为用户如何输入数字5而不是字符串"5"

答案 2 :(得分:0)

要检查字符串是否包含有效整数(或浮点数等),您可以使用此方法:

def coerce(string)
  Integer(string) rescue Float(string) rescue string
end 

coerce('115').class      # Fixnum
coerce('115.12').class   # Float
coerce('115.aa').class   # String

同时查看highline gem,它提供了许多有用的功能,当涉及到cli。

答案 3 :(得分:0)

您不了解键盘设备和控制台输入的工作原理。

键盘上输入

所有输入并通过gets或其他任何内容读取,始终一个字符串。你无法得到任何其他东西。

我们使用gets.chomp删除用户按 Return Enter 时输入的尾随换行符。例如,如果我没有输入任何其他内容,则裸gets将返回行尾:

gets #=> "\n"

添加其他字符会产生这些字符,以及终止的行尾:

gets #=> "foo\n"

我们使用chomp删除该尾随行尾。重复相同的输入并使用chomp

gets.chomp #=> ""
gets.chomp #=> "foo"

Ruby可以很容易地判断输入的内容是否可以干净地转换为整数。只需使用Integer()即可。以下是IRB会话的一些输出:

>> Integer('1') #=> 1
>> Integer('123') #=> 123
>> Integer('foo')
ArgumentError: invalid value for Integer(): "foo"
    from (irb):14:in `Integer'
    from (irb):14
    from /usr/local/bin/irb:12:in `<main>'
>> Integer('1a')
ArgumentError: invalid value for Integer(): "1a"
    from (irb):15:in `Integer'
    from (irb):15
    from /usr/local/bin/irb:12:in `<main>'

使用rescue可以轻松处理异常:

begin
  Integer('1')
rescue ArgumentError
  puts 'not a number'
end #=> 1

或者:

begin
  Integer('a')
rescue ArgumentError
  'not a number'
end #=> "not a number"