Guillaume Nargeot
2/23/2007 1:54:00 AM
The problem with ruby is that you can't use a switch as it behaves with many
other languages like C, php, etc.
For example, you want to convert the following peace of code to ruby:
switch (x) {
case 1:
case 2:
# do something
break;
case 3:
# do some other thing
break;
default:
}
it seems you can do it with the following code:
case x
when 1..2
# do something
when 3
# do some other thing
else
end
But when it comes to strings, you would like to be able to do simply:
case x
when "this"
when "that"
# do something common to "this" and "that"
when "nothing"
# something different
end
The problem is that you can't, because of the fact the "break" is implicit
in
the ruby language.
The fact is that you don't want to rewrite the same code two times.
Of course, you would be able to right your code into a function, and then
just
write:
case x
when "this"
func_this_that()
when "that"
func_this_that()
when "nothing"
# something different
end
But if again, you don't want to relay on a function call, here's a solution
I thought about.
This is not perfect, because you have to change your syntax, but it might be
quite useful in some cases.
# Redefine the === method of the Array class, that is used to match the
argument
# of the "case" directive.
class Array
# Return true if self contains any element of the given parameter.
def ===(o)
o.each do |e|
return true if self.include?(e)
end
false
end
end
# Example 1
x = ["case4"]
case x
when ["case1", "case2"]
puts "first case"
when ["case3", "case4", "case5"]
puts "second case"
when ["case6"]
puts "third case"
else
puts "not matched"
end
# Returns: "second case"
# Example 2
x = [6]
case x
when [1, 2]
puts "first case"
when [3, 4, 5]
puts "second case"
when [6]
puts "third case"
else
puts "not matched"
end
# Returns: "third case"
What do you think about it ?