【问题标题】:if statement in ruby, to determine input typeruby 中的 if 语句,用于确定输入类型
【发布时间】:2016-12-02 02:41:06
【问题描述】:

我正在尝试用 ruby​​ 制作一个小型刽子手游戏。我正在尝试使用以下代码验证猜测输入:

puts "Enter a word: "
answer = gets.chomp
tries = 5
answer_array = answer.chars

until tries == 0
  hits = ""
  puts "enter your guess: "
  guess = gets[0]
  if guess.class != "String"
    puts "enter a letter!!"
  else
    puts "nice!!!"
  end
  tries -= 1
end

出于某种原因——无论我得到guess 的任何输入——程序都会抛出“输入一个字母!”。我定义 if 语句的方式有问题吗?我只是想让它区分字符串和整数。

【问题讨论】:

  • 试试if guess.class != Stringnot(guess.is_a? String)guess.class.name != "String"

标签: ruby string class if-statement integer


【解决方案1】:

gets 总是返回一个字符串,所以我认为你不想验证它的类。如果要检查输入是否为单个字母,可以先检查输入的长度是否为1:
guess.length == 1

然后,您可以使用正则表达式检查它是否真的是一个字母:
(guess =~ /[A-Za-z]/) == 0
这基本上找到了guess中第一个字母的位置;因为位置 0 应该只有一个字母,所以如果guess 是一个字母,这个条件就会成立。

如此组合:

guess = gets.chomp # You want to remove the newline!
if (guess.length == 1) and (guess =~/[A-Za-z]/) == 0
  puts "Nice!"
  ...
else
  puts "Input a single letter!"
end

【讨论】:

  • 或者,使用/[a-z]/i 表示不区分大小写的正则表达式。
  • 另外:guess.match(/\A[A-Za-z]+\z/) 测试该行是否包含 一个或多个 字符,在最新的 ruby​​ 中,match? 可以更有效地进行测试。 (x =~ /.../) == 0 的东西很奇怪。
【解决方案2】:

guess.name 返回一个常量 String。您需要注意 String"String" 不同。当你用单引号将它括起来时,它变成一个字符串,但不是一个常量。

所以,把你的 if 子句改成

    if guess.class != String
       puts "enter a letter!!"
    else
       puts "nice!!!"
    end

或者,使用.is_a? 方法。

    if guess.is_a?(String)
       puts "enter a letter!!"
    else
       puts "nice!!!"
    end

【讨论】:

  • Erm... 同样值得注意的是,这段代码毫无意义,因为guess总是成为String!当然,我们真正想做的是:guess = gets.chomp; if guess.length != 1 ....
  • 是的。这也有道理。
  • 或者甚至if guess !~ /\A[a-zA-Z]\z/ ...
猜你喜欢
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
  • 2011-12-01
  • 2016-11-09
  • 1970-01-01
  • 2019-06-18
  • 2013-06-13
  • 2017-11-14
相关资源
最近更新 更多