2012/08/09

ruby中case语句的默认行为

通常情况下,大家会这样使用case语句
name = case x
        when 1; "one"
        when 2; "two"
        when 3; "three"
        else "many"
       end

在这种形式的case语句中,ruby会对case后跟的语句进行一次求职,接着按出现的先后顺序逐一和when语句所跟的表达式比较。如果找到匹配项则执行相应操作并返回,否则执行else块的语句并退出。

前边说的这些case的行为很容易理解,接下来说说需要我们注意的地方,即case语句是如何将我们提供的表达式逐一和when语句比较的,比较的标准是什么。事实上,这里的比较是通过===操作符实现的。也就是说之前的示例实际上是按一下逻辑执行的:

name = case
        when 1 === x; "one"
        when 2 === x; "two"
        when 3 === x; "three"
        else "many"
       end

===操作符针对不同class的行为不同,逐一介绍

Fixnum类 ===操作针对Fixnum类的行为与==操作相同,仅是比较操作符两端的数值是否相等。
Class类 ===操作会检查操作符右边的项是否是左边项所指定的class的一个实例。
Regexp类 ===操作会检查操作符右边的项是否匹配左边项所指定的正则表达式。
Range类 ===操作会检查操作符右边的项是否落在左边项所指定的区间内。

示例代码:
puts case x
  when String then "string"
  when Numeric then "number"
  when TrueClass, FalseClass then "boolean"
  else "other"
  end

while line=gets.chomp do
  case line
    when /^\s*#/
      next
    when /^quit$/i
      break
    else
      puts line.reverse
  end
end

没有评论:

发表评论