From: Robert Klemme Date: 2010-07-10T20:55:09+09:00 Subject: Re: if statements and case statements questions On 10.07.2010 06:30, John Crichton wrote: > 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 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 <