Project

General

Profile

Bug #12376

No error for elseif condition

Added by dsferreira (Daniel Ferreira) almost 4 years ago. Updated almost 4 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:75490]

Description

Something I have been for a long time wondering about.
I don't know if this is a parsing problem or not but for me it seems like it is.

Replication:

$ irb
> RUBY_VERSION
 => '2.3.0'
> a = 1
> if a == 2
>   puts 2
> elsif a == 3
>   puts 3
> elseif a == 1
>   puts 1
> else
>   puts 0
> end
0
 => nil

Shouldn't we have a parse error triggered here?
We can replace elseif for any other instruction like foo for instance.

I believe this behaviour is around for a long time.

Updated by dsferreira (Daniel Ferreira) almost 4 years ago

  • ruby -v changed from 2.30 to 2.3.0

Updated by zverok (Victor Shepelev) almost 4 years ago

It is parsed as

if a == 2
  puts 2
elsif a == 3
  puts 3
  elseif(a == 1)
  puts 1
else
  puts 4
end

With elseif being just a method call. With this branch not evaluated, there is no problem with unknown method in it.

Updated by matz (Yukihiro Matsumoto) almost 4 years ago

  • Status changed from Open to Closed

it's parsed like

a = 1
if a == 2
  puts 2
  elseif(a==1)
  puts 1
else
  puts 0
end

and the method elseif is not called in the false condition.
But you can find this kind of bugs using rubocop or other tools

Matz.

Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

And most editors can high-light keywords, but not elseif, as shown in this page, FYI.

Updated by usa (Usaku NAKAMURA) almost 4 years ago

  • Status changed from Closed to Rejected

Updated by dsferreira (Daniel Ferreira) almost 4 years ago

Of course.
Makes perfect sense.
I would say the way to handle this bugs in a pro-active way would be to use 100% coverage in the test suite.
I can not see how the bug would be missed with that.
TDD as a must in ruby like always.
Thank you for the enlightenment Sirs.

Updated by mame (Yusuke Endoh) almost 4 years ago

You may want to use a code lint tool, such as rubocop.

BTW, next quiz:

> a = 1
> if a == 2
>   puts 2;
> elsif a == 3
>   puts 3.
> elsif a == 1
>   puts 1;
> else
>   puts 0;
> end
0
 => nil

--
Yusuke Endoh mame@ruby-lang.org

Also available in: Atom PDF