From: John Crichton on 10 Jul 2010 00:30 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 -- Posted via http://www.ruby-forum.com/.
From: Zundra Daniel on 10 Jul 2010 00:38 [Note: parts of this message were removed to make it a legal post.] 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 :-) On Sat, Jul 10, 2010 at 12:30 AM, John Crichton <a2533488(a)bofthew.com>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 > > 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 > -- > Posted via http://www.ruby-forum.com/. > >
From: Kenneth on 10 Jul 2010 02:18 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. -- Posted via http://www.ruby-forum.com/.
From: Kenneth on 10 Jul 2010 02:21 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 -- Posted via http://www.ruby-forum.com/.
From: Robert Klemme on 10 Jul 2010 07:54 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 <<BLAH_LINE alias :=== :[] end case line when BLAH_LINE puts "This is it." .... end Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/
|
Next
|
Last
Pages: 1 2 Prev: [ANN] sqlite3-ruby 1.3.1 Released Next: [ANN] Zbatery v0.3.0 - for newer Rainbows! |