这个Ruby案例控制代码有什么问题?

时间:2015-05-16 21:01:42

标签: ruby switch-statement

def identify_class(obj)

result = case obj
when obj.kind_of? Hacker  then "It's a Hacker!"
when obj.kind_of? Submission then "It's a Submission!"
when obj.kind_of? TestCase then "It's a TestCase!"
when obj.kind_of? Contest then "It's a Contest!"
    end

puts result   

end
  

语法错误,意外tCONSTANT,期待keyword_then或','或&#39 ;;'要么   ' \ n'

在result = case obj语句和一堆

之后
  

语法错误,意外的keyword_when,期待keyword_end

在每个when语句之后,最后输出错误的结尾除外。

如果删除除了一个之外的每个when语句,它甚至都不会工作,尽管第二个错误消失了。

我尝试使用if else梯形图,但它也不起作用

如果obj.kind_of可以使用一个单独的吗?黑客提出了#34;它是......"

1 个答案:

答案 0 :(得分:2)

在Ruby中有两种类型的case表达式,你似乎对它们感到困惑。第一个与if...elsif...end表达式基本相同,如下所示:

case
when boolean_expression
  # code executed if boolean_expression is truthy
when other_expression
  # code executed if other_expression is truthy
# other whens ...
end

请注意第一个case之前when之后没有任何内容。在这种类型的case语句中,将执行与计算结果为true的第一个表达式相关联的代码,而不执行其余的代码。

另一种case语句接受一个参数并将该参数与每个when子句进行比较:

case obj
when type1
  # some code if type1 === obj
when other_type
  # some code if other_type === obj
# other whens ...
end

此处有一个case(本例中为obj)的参数。这将使用===依次与每个when子句的参数进行比较,并且为该比较为真的第一个运行相关代码。

请注意,此类case可以像第一种类型一样编写:

case
when type1 === obj
# etc...

在您的情况下,您从case obj开始,表示第二种类型。然后,在每个obj子句中使用when,就像在第一种中一样。

(你得到的实际错误实际上只是由Ruby语法中的一些含糊不清引起的语法错误,但即使你修复了你的代码不能按照你的预期工作。)

模块overrides === to check if the arg is an instance,所以为了您的使用,您可以这样做:

result = case obj
when Hacker  then "It's a Hacker!"
when Submission then "It's a Submission!"
when TestCase then "It's a TestCase!"
when Contest then "It's a Contest!"
end