[ruby-core:93909] Re: [Ruby master Bug#16020] Forbid `if` `elsif` without a condition
From:
Austin Ziegler <halostatue@...>
Date:
2019-07-25 13:46:44 UTC
List:
ruby-core #93909
This is not a syntax error, but a logic error. Ruby is not line-oriented, but expression oriented. The parser knows that `if` has to have a condition, so if it does not find one in the next token, it looks for the next expression. This is what your code _actually_ got parsed as: ```ruby if puts "!!!!1" elsif puts "!!!!2" elsif puts "!!!!3" else puts "!!!!4" end ``` `Kernel#puts` returns `nil`, which is falsy and imperative, so the `puts` for 1, 2, and 3 must execute and because all of them are false, the puts for 4 executes. This is clearer if you add something else: ```ruby if puts "!!!!1" puts 1 elsif puts "!!!!2" puts 2 elsif puts "!!!!3" puts 3 else puts "!!!!4" end ``` -a On Thu, Jul 25, 2019 at 8:17 AM <bogdanvlviv@gmail.com> wrote: > Issue #16020 has been reported by bogdanvlviv (Bogdan Denkovych). > > ---------------------------------------- > Bug #16020: Forbid `if` `elsif` without a condition > https://bugs.ruby-lang.org/issues/16020 > > * Author: bogdanvlviv (Bogdan Denkovych) > * Status: Open > * Priority: Normal > * Assignee: > * Target version: > * ruby -v: ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux > * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN > ---------------------------------------- > Hello. > > I might have missed something, but examples like: > ```ruby > if > puts "!!!!1" > elsif > puts "!!!!2" > elsif > puts "!!!!3" > else > puts "!!!!4" > end > > # Output: > # !!!!1 > # !!!!2 > # !!!!3 > # !!!!4 > ``` > > ```ruby > if false > puts "!!!!1" > elsif 1==2 > puts "!!!!2" > elsif > puts "!!!!3" > else > puts "!!!!4" > end > > # Output: > # !!!!3 > # !!!!4 > ``` > > are confusing. We probably should raise `SyntaxError` in the case when > `if`/`elsif` is being used without any condition. What do you think about > it? > > Original source: > https://twitter.com/bogdanvlviv/status/1154356514628493313 > > > > -- > https://bugs.ruby-lang.org/ > > Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> > <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core> > -- Austin Ziegler 窶「 halostatue@gmail.com 窶「 austin@halostatue.ca http://www.halostatue.ca/ 窶「 http://twitter.com/halostatue Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>