2016-08-19 34 views
-1

我试图创建一个程序来测试插入的输入是文本还是数字还是特殊字符。所以我用!a.is_a? Integer。但是,我的代码似乎不工作。我得到这个错误:测试输入的数字是否不是文本 - RUBY

syntax error, unexpected TCONSTANT. expecting keyword then ,

这里是我的代码:

print "Enter Number Please: " 
a = gets.chomp.to_i 

answer = case a 

when 3 
    "OUTPUT: a is 3" 
when 4 
"OUTPUT: a is 4" 
when !a.is_a? Integer 
    "You did not enter a number." 
else 
    "OUTPUT: a is neither 3, nor 4" 
end 

puts answer 

我理解这可能是更好的尝试与整型(OBJ),但有什么办法,使这项工作?

回答

2

这里有几件事要注意。举一个,to_i的结果是总是一个整型值。测试!a.is_a? Integer是多余的,因为这永远不会失败。

您还需要记住的是,case语句本身使得它非常容易比较类:

case (a) 
when Integer 
    puts "I'm a number!" 
when String 
    puts "I'm a string!" 
end 

注意第一个条件自动触发任何整数值。

即使它们相当慷慨,您可以在when条款中放置什么也是有限制的。为了让解析器正确地解释你问什么,你必须表达出来是这样的:

when !a.is_a?(Integer) 

虽然所指出这可以降低到when Integer所以剩下的这些是多余的。

您还需要避免在case部分中指定某些内容,然后再引用一个变量。任何阅读你的代码的人都会感到困惑,这可能是不必要的。如果您正在处理复杂的逻辑问题,请使用一系列if声明来说明问题。

+0

在另一方面,'gets'总是会返回一个字符串,所以'当Integer'条件将永远不会被触发。 – Stefan

+2

此外,'when!a.is_a?(Integer)'相当于'when true'或'false when',因为表达式在用于比较之前将被展开。因此他们也不会在这里匹配。为了检查复杂的条件,你必须使用Procs中的'when - >(v){!v.is_a?(Integer)}' –

0

您可以用三元做得一样好,我认为,像这样:

def integer?(number) 
    number.is_a?(Integer) ? "This is a number" : "This is not a number" 
end 
相关问题