Bug #12376
closedNo error for elseif condition
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 8 years ago
- ruby -v changed from 2.30 to 2.3.0
Updated by zverok (Victor Shepelev) almost 8 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 8 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 8 years ago
And most editors can high-light keywords, but not elseif
, as shown in this page, FYI.
Updated by usa (Usaku NAKAMURA) almost 8 years ago
- Status changed from Closed to Rejected
Updated by dsferreira (Daniel Ferreira) almost 8 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 8 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