From: "Jesús Gabriel y Galán" Date: 2007-12-21T20:30:38+09:00 Subject: Re: Problem with case statements On Dec 21, 2007 12:14 PM, hemant kumar wrote: > I have an innocent looking code: > > 54: def find(*args) > 55: options = args.extract_options! > 56: validate_find_options(options) > 57: case args.first > 58: when :first: find_first(options) > 59: when :all: find_all(options) > 60: else raise "Invalid find" > 61: end > 62: end > > > Now, above case statement totally blows up with Ruby 1.9: My test is with Ruby 1.8.6 but: > > /home/hemant/push_server/bin/boot.rb:34:in > `require': /home/hemant/push_server/lib/db_connection.rb:58: syntax > error, unexpected ':', expecting keyword_then or ',' or ';' or > '\n' (SyntaxError) > when :first: find_first(options) if you want to put the body of the when in the same line you need a then keyword: irb(main):018:0> def find(*args) irb(main):019:1> case args.first irb(main):020:2> when :first then puts "first" irb(main):021:2> when :all then puts "all" irb(main):022:2> else raise "invalid" irb(main):023:2> end irb(main):024:1> end => nil irb(main):025:0> find :first, 1, 2, 3, 4 first => nil > However if i rewrite it like this, it works: > > def find(*args) > options = args.extract_options! > validate_find_options(options) > case args.first > when :first > find_first(options) > when :all > find_all(options) > else > raise "Invalid find" > end > end > > Why is this? Was this intended? From the pickaxe: "The then keyword (or a colon) separates the when comparisons from the bodies and is not needed if the body starts on a new line." Hope this helps, Jesus.