# If statements and case statements questions

**URL:** <https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356>\
**Category:** Ruby\
**Created:** [July 10, 2010, 6:30am UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356 "2010-07-10T06:30:56Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 6:30am UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/1 "2010-07-10T06:30:56Z")

</div>

I am fairly new to Ruby and programming and had a couple questions about  
if/else and case statements. I was wondering if there were benefits to  
using case statements instead of if/elsif/else type statements. Are  
case statements faster?

If I am reading in a file line by line and doing something similar to

lines = File.open(“file.csv”)  
FasterCSV.parse(lines) do |row|  
if ( lines =~ /^blah/)

```
puts "blahblahblah"
some_method

```

end

if ( lines =~ /^name/ && row[1] ==“123”)  
puts “ping pong abc”  
another\_method  
end  
if ( lines =~ /^address/ && row[3] ==“XYZ”)  
puts “abcdefghijklmnopqrstuvwxyz”  
method3  
end  
end

Does writing it with a case statement like so benefit me?  
lines = File.open(“file.csv”)  
FasterCSV.parse(lines) do |row|  
case  
when ( lines =~ /^blah/)  
puts “blahblahblah”  
some\_method

when ( lines =~ /^name/ && row[1] ==“123”)  
puts “ping pong abc”  
another\_method

when ( lines =~ /^address/ && row[1] ==“XYZ”)  
puts “abcdefghijklmnopqrstuvwxyz”  
method3  
end  
end

While writing this I couldn’t figure out how to write my case to be “if  
lines begins with”  
case “lines =~”  
when /^blah/  
puts “blahblahblah”  
some\_method

Lastly is there a “better” way to write an if statement that is  
conditional on a bunch of things like  
if row[0] == john && row[7] == abc123 && row[8] != nil &&  
somehashtable.has\_key?(row2)

Thanks

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 6:38am UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/2 "2010-07-10T06:38:40Z")

</div>

Case statements are not faster. Both Case and if statements are  
constant  
time operations so there is no speed benefit of one over the other. It  
really just comes down to your preference in any given situation.  
Depending  
on the code one or the other can lead to cleaner and easier to  
understand  
code.

Oh and cool name btw 🙂

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 8:18am UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/3 "2010-07-10T08:18:32Z")

</div>

Ruby switches expand to the === operator, for example:

case string  
when “” then puts “Empty”  
when /^a/ then puts “Starts with a”  
end

is equivalent to:

if string === “”  
puts “Empty”  
elsif string === /^a/  
puts “Contains a”  
end

Your first way of doing things, with the three if statements, you should  
change the last two to elsifs.

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 8:21am UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/4 "2010-07-10T08:21:27Z")

</div>

Also since you are not just comparing lines but also row numbers, you  
can’t use

case lines  
when …  
when …  
end

I guess you should stick with the if elsif … end

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 1:55pm UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/5 "2010-07-10T13:55:52Z")

</div>

On 10.07.2010 06:30, John Crichton wrote:

> ```
> method3
> 
> ```
> 
> when ( lines =~ /^name/&& row[1] ==“123”)  
> puts “ping pong abc”  
> another\_method
> 
> when ( lines =~ /^address/&& row[1] ==“XYZ”)  
> puts “abcdefghijklmnopqrstuvwxyz”  
> method3  
> end  
> end

I personally prefer the case because then it is immediately clear that  
there is a set of alternatives that belong together. The difference to  
if elsif else end isn’t too big though.

> While writing this I couldn’t figure out how to write my case to be “if  
> lines begins with”  
> case “lines =~”  
> when /^blah/  
> puts “blahblahblah”  
> some\_method

I think that has been answered already: since you have more conditions  
there is no easy alternative to the case form where the condition is in  
when clause. If you need only a regexp match as only criterion then you  
can do

case line  
when /^blah/  
puts “This is a blah line: #{line}”  
when /.$/  
puts “This line ends with a dot.”  
end

> Lastly is there a “better” way to write an if statement that is  
> conditional on a bunch of things like  
> if row[0] == john&& row[7] == abc123&& row[8] != nil&&  
> somehashtable.has\_key?(row2)

Well, you can encapsulate your condition in something else and use that.  
Example:

BLAH\_LINE = lambda {|line| /^blah/ =~ line && line.length \> 87}  
class \<\<BLAH\_LINE  
alias :=== :[]  
end

case line  
when BLAH\_LINE  
puts “This is it.”  
…  
end

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 12, 2010, 8:17pm UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/6 "2010-07-12T20:17:40Z")

</div>

Thank you all for your replies/answers. I appreciate the help and  
explanations.

---

<div class="post-metadata">

**Author:** ![amin1426](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4da419/32.png) [@amin1426](https://www.ruby-forum.com/u/amin1426)\
**Post date:** [July 10, 2010, 6:08pm UTC](https://www.ruby-forum.com/t/if-statements-and-case-statements-questions/191356/7 "2010-07-10T18:08:54Z")

</div>

Kenneth Â Â Â wrote:

> Ruby switches expand to the === operator, for example:
> 
> case string  
> when “” then puts “Empty”  
> when /^a/ then puts “Starts with a”  
> end
> 
> is equivalent to:
> 
> if string === “”  
> puts “Empty”  
> elsif string === /^a/  
> puts “Contains a”  
> end

Actually the arguments are the other way round:

if “” === string  
puts “Empty”  
elsif /^a/ === string  
puts “Starts with a”  
end

Another example:

case arg  
when String; puts “it’s a string”  
when Numeric; puts “it’s a number”  
end

The first expands to String === arg, which is functionally equivalent to  
arg.is\_a?(String)
