Newbie: if / elseif

P

planetthoughtful

Hi All,

I'm a little confused about why the following two pieces of code seem
to behave differently:

if $val =~ /this/i
puts "this"
elseif $val =~ /that/i
puts "that"
elseif $val =~ /the other/i
puts "the other"
end

if $val contains "this is the other value", for some reason "the
other" is not put by the last elseif statement. However, the following
code works as expected:

if $val =~ /this/i
puts "this"
end
if $val =~ /that/i
puts "that"
end
if $val =~ /the other/i
puts "the other"
end

Am I missing something about if / elseif in ruby?

Any help appreciated!

pt
 
P

planetthoughtful

Am I missing something about if / elseif in ruby?

Obviously I was missing something - the correct syntax. I'm now aware
that the syntax should be "elsif" rather than "elseif".

Thanks all,

pt
 
A

Augie De Blieck Jr.

if $val =~ /this/i
puts "this"
elseif $val =~ /that/i
puts "that"
elseif $val =~ /the other/i
puts "the other"
end

Just remember that even when you spell it right, it's going to drop
out of the whole construct just as soon as it fulfills a RegEx. After
it prints "this," it stops looking at any of the other "elsif"
statements.

That short circuiting is a feature. =)

-Augie
 
C

Chad Perrin

Just remember that even when you spell it right, it's going to drop
out of the whole construct just as soon as it fulfills a RegEx. After
it prints "this," it stops looking at any of the other "elsif"
statements.

That short circuiting is a feature. =)

Indeed -- that's the whole point of using elsif rather than just a list
of separate if statements. The if/elsif/else construct is used for
mutually exclusive flow control, where only one of several is to be
executed. Using a series of if statements considers each in a vacuum,
in order, while if/elsif/else considers them all as part of a greater
whole.
 
P

planetthoughtful

Just remember that even when you spell it right, it's going to drop
out of the whole construct just as soon as it fulfills a RegEx. After
it prints "this," it stops looking at any of the other "elsif"
statements.

Yes, that was the behaviour I was looking for. I noticed I provided an
ambiguous example in that in another construct it would possibly have
matched two different conditions. However, in my actual script I am
looking for values that are mutually exclusive, so exiting on finding
a value is fine.

All the best,

pt
 
J

John Joyce

So it doesn't work like the C variety?

if ( condition )
statement // maybe done
else if ( condition )
statement // or maybe done
else
statement // done if the 1st and 2nd are not done


Honestly, my biggest difficulties so far are that I think of code
somewhere between C and PHP (I like to call it a nicer C)
 
C

Chad Perrin

So it doesn't work like the C variety?

if ( condition )
statement // maybe done
else if ( condition )
statement // or maybe done
else
statement // done if the 1st and 2nd are not done

Err . . . I'm pretty sure if, elsif, else works exactly like the C if,
else if, else.
 
P

Phrogz

I'm a little confused about why the following two pieces of code seem
to behave differently:

if $val =~ /this/i
puts "this"
elseif $val =~ /that/i
puts "that"
elseif $val =~ /the other/i
puts "the other"
end

Thought I'd point out that Ruby's case statement is more powerful than
many other languages' switch statements:

%w| pthisic thatch mother armadillo |.each{ |val|
case val
when /this/i
puts "'#{val}' contains 'this'"
when /that/i
puts "'#{val}' contains 'that'"
when /other/i
puts "'#{val}' contains 'other'"
else
puts "'#{val}' does not contain 'this', 'that', or 'other'"
end
}

#=> 'pthisic' contains 'this'
#=> 'thatch' contains 'that'
#=> 'mother' contains 'other'
#=> 'armadillo' does not contain 'this', 'that', or 'other'


Also, note (as seen above) that the regexp you supplied as example
match substrings even inside words. Just in case you wanted exact case-
insenstive string matching, perhaps /\Athis\Z/i would be more
appropriate. If you wanted exact word matching, perhaps /\bthis\b/i
might be what you want.
 
D

David A. Black

Hi --

Err . . . I'm pretty sure if, elsif, else works exactly like the C if,
else if, else.

Pretty much, except in Ruby there's no need for a rule to resolve
if/else ambiguity, because 'end' always makes it clear.


David

--
Q. What is THE Ruby book for Rails developers?
A. RUBY FOR RAILS by David A. Black (http://www.manning.com/black)
(See what readers are saying! http://www.rubypal.com/r4rrevs.pdf)
Q. Where can I get Ruby/Rails on-site training, consulting, coaching?
A. Ruby Power and Light, LLC (http://www.rubypal.com)
 
C

Chad Perrin

Hi --



Pretty much, except in Ruby there's no need for a rule to resolve
if/else ambiguity, because 'end' always makes it clear.

Thanks for adding that. I had forgotten about that, largely because I
haven't written a line of C/C++ in about five years.

I imagine there are other differences as well, but for the general case
I haven't run across any (yet). Still new to Ruby, may just not have
encountered further differences yet.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top