Bug #13879


[Not sure if a bug or not] case/when menus and trailing ',' commas in when clauses

Added by shevegen (Robert A. Heiler) over 5 years ago. Updated over 5 years ago.

Target version:
ruby -v:
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]



I am not sure if the following is a bug or a feature.

x = 'foobar'
case x
when 'a','b','c',
  x = 5
puts x

Works fine.

But this here:

x = 'foobar'
case x
when 'a','b','c',
  puts 5

Leads to this error:

syntax error, unexpected tINTEGER, expecting keyword_do or '{' or '('

Is this deliberately so? My confusion is that case/when works fine
in one case, but leads to an error in another case. I am not
sure if it is a bug or not, but I believe in the first case,
the user may have not wanted to put a trailing ',' there and
simply forgot to remove it. That is actually how I found out about
this behaviour, since I have a huge case/when menu and sometimes
make typos when re-arranging entries, including such trailing ','
via copy/paste jobs. :)

If it is a bug then perhaps it can be fixed; if it is not a
bug, perhaps the official documentation could explain this
feature? Or perhaps if trailing ',' are not useful, there
may be a warning issued or something in the first case.

Anyway, I am just reporting this in case nobody knows about
this - feel free to close this issue at any moment in time.


Updated by shevegen (Robert A. Heiler) over 5 years ago

I forgot to add - I assume that the puts invocation may lead to
trigger the above behaviour. My main confusion is why the ','
placed matters, depending on as to whether one does an assignment,
or invokes a method instead. I would have assumed that the first
example would also issue a syntax error or similar, but instead
ruby works just fine with it, so I am not sure if this is a bug
or intended behaviour.

Updated by nobu (Nobuyoshi Nakada) over 5 years ago

  • Description updated (diff)
  • Status changed from Open to Rejected

That when clause continues by the last comma, so your example equals the following code syntactically.

x = 'foobar'
case x
when 'a','b','c', x = 5
puts x
x = 'foobar'
case x
when 'a','b','c', puts 5

But command calls (method calls with arguments but no parentheses) can't be there, because of the precedence.


Also available in: Atom PDF