elseif v. elsif ??

7

7stud 7stud

What the?? I just spent two days trying to figure out why I couldn't
reproduce the example in "Ruby in 20 minutes" and get it to work. After
examining my code line for line against the example code and not being
able to detect any error, I was assembling several code examples into a
text file to post here, when I happened to notice 'elsif'. Why
didn't Ruby flag 'elseif' as an error?


Does Ruby try differentiate itself in ridiculous ways like that just for
the sake of being different? And why isn't something like that
explicitly pointed out in a beginning tutorial? So far, I have to give
Ruby two thumbs down.

C++, Java, Javascript, php, Servlets+JSP programmer
 
C

Chad Perrin

Does Ruby try differentiate itself in ridiculous ways like that just for
the sake of being different? And why isn't something like that
explicitly pointed out in a beginning tutorial? So far, I have to give
Ruby two thumbs down.

Ruby isn't the only language that does that.

"Different" would be more like the way bash does it: "elif"
 
R

Robert Dober

What the?? I just spent two days trying to figure out why I couldn't
reproduce the example in "Ruby in 20 minutes" and get it to work. After
examining my code line for line against the example code and not being
able to detect any error, I was assembling several code examples into a
text file to post here, when I happened to notice 'elsif'. Why
didn't Ruby flag 'elseif' as an error?
Because it nvere sees it :(

Look at two examples

if true then
whatever
elseif
end

now elsif is seen as an undefined method but

if false then
whatever
elseif
end

whatever and elseif are not evaluated.

I strongly advice you to use a syntax highlighting ediotr like e.g.
vim, emacs, Jedit, geany and tons of others.

Cheers
Robert
 
H

Hans Sjunnesson

What the?? I just spent two days trying to figure out why I couldn't
reproduce the example in "Ruby in 20 minutes" and get it to work. After
examining my code line for line against the example code and not being
able to detect any error, I was assembling several code examples into a
text file to post here, when I happened to notice 'elsif'. Why
didn't Ruby flag 'elseif' as an error?

Does Ruby try differentiate itself in ridiculous ways like that just for
the sake of being different? And why isn't something like that
explicitly pointed out in a beginning tutorial? So far, I have to give
Ruby two thumbs down.

C++, Java, Javascript, php, Servlets+JSP programmer

Well, Ruby doesn't try to differentiate itself in ridiculous ways just
for the sake of being different. It's not a person.
However, it will spit out a "undefined method 'elseif' for main:Object
(NoMethodError)" when you use 'elseif', so it's really not a problem
is it?
 
S

Stefano Crocco

Alle mercoled=EC 7 marzo 2007, Robert Dober ha scritto:
if true then
=A0 =A0whatever
=A0 =A0elseif
end

now elsif is seen as an undefined method but

Not always. In Robert's first example,=20
if true then
whatever
elseif
end

you'll get a NameError (undefined local variable or method `elseif' for=20
main:Object (NameError))

In the following example, instead, you get a syntax error:

if x < 0 then puts "x<0"
elseif x < 3 then puts "0<=3Dx<3"
else puts "x>=3D3"
end

The error message is:

syntax error, unexpected kTHEN, expecting kEND
elseif x < 3 then puts "0<=3Dx<3"
^
Here, ruby doesn't complain because elseif doesn't exist, but because it fi=
nds=20
a 'then' where it shouldn't be (not following an if or elsif clause). By th=
e=20
way, being a syntax error (it when the interpreter is parsing the file, not=
=20
when it executes it), this error is reported whatever the value of x is (an=
d=20
even if x doesn't exist).

All these error messages aren't very easy to understand for a novice. To ma=
ke=20
a comparison with other programming languages, I tried compiling a C progra=
m=20
with a similar mistake (in this case writing 'elseif' instead of 'else if')=
=2E=20
The program was:

int main(){
int a=3D3;
int b=3D0;
if( a=3D=3D4){ b=3D1;}
elseif(a=3D=3D2){ b=3D2;} //should be else if
else{ b=3D3;}}
}

Compiling with gcc, the error message I got is:

test.c: In function 'main':
test.c:5: error: expected ';' before '{' token

As you can see, the error message doesn't speak of invalid keywords, but j=
ust=20
of a missing ;

Stefano
 
R

Robert Dober

Well, Ruby doesn't try to differentiate itself in ridiculous ways just
for the sake of being different. It's not a person.
However, it will spit out a "undefined method 'elseif' for main:Object
(NoMethodError)" when you use 'elseif', so it's really not a problem
is it?
No of course it is not :)
I think to understand the frustration of OP however.
He is probably coming from a completely different world and it is not
always easy to grasp new concepts.
Therefore I preferred to ignore the aggressive nature of the post ;).
He might even have a point when he says that this is maybe not really
well documented, With this I do not mean the "elseif" of course but
just the dynamic evaluation of the code.

Maybe a chapter for that kind of pitfalls could be added somewhere -
well it probably is already, maybe somebody can indicate that.

This is however not a clearcut thing as it might seem at first view.

Robert
 
7

7stud 7stud

Chris said:
Perhaps at the "Ruby from other languages" page :
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/

I find this page very helpful.

Regards,


Chris


First, I'd like to say that the web site is really beautiful and eye
catching. There are some minor problems, for instance, the code
examples are in a small area width wise, so there is a horizontal scroll
bar that you need to scroll to the right to see the latter portion of a
line of code. However, the area with the code is very tall(more than
one screen), and it is very inconvenient to page all the way down to the
bottom in order to scroll to the right, and then go all the way back up
in order to read the code. Also, no matter how wide I make my browser
window(Safari 2.0.4), the area with the code does not expand
horizontally. It should expand horizontally as the browser window gets
wider, and the horizontal scroll bars should disappear.

If I run the following code, I don't get any errors:

class MegaGreeter
attr_accessor :names

#constructor
def initialize(names = "world")
@names = names
end

#functions:
def say_hi
if @names.nil?
puts "..."
elseif @names.respond_to?("each")
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
end
if __FILE__ == $0
mg = MegaGreeter.new(["Sally", "Jane", "Bob"])
mg.say_hi
end
 
7

7stud 7stud

My output is:

~/2testing/dir1$ ruby rubyHelloWorld.rb
Hello SallyJaneBob!

ruby version:

~/2testing/dir1$ ruby -v
ruby 1.8.2 (2004-12-25) [universal-darwin8.0]
 
B

Brian Candler

If I run the following code, I don't get any errors:

class MegaGreeter
attr_accessor :names

#constructor
def initialize(names = "world")
@names = names
end

#functions:
def say_hi
if @names.nil?
puts "..."
elseif @names.respond_to?("each")
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
end
if __FILE__ == $0
mg = MegaGreeter.new(["Sally", "Jane", "Bob"])
mg.say_hi
end

That's because you're not exercising the section under @names.nil?

Try: mg = MegaGreeter.new(nil)
 
R

Robert Dober

My output is:

~/2testing/dir1$ ruby rubyHelloWorld.rb
Hello SallyJaneBob!

ruby version:

~/2testing/dir1$ ruby -v
ruby 1.8.2 (2004-12-25) [universal-darwin8.0]

I could explain why, but just follow Stefano's advice and put "then"
after each if elsif and elseif and you will see.

Robert
 
R

Robert Dober

If I run the following code, I don't get any errors:

class MegaGreeter
attr_accessor :names

#constructor
def initialize(names = "world")
@names = names
end

#functions:
def say_hi
if @names.nil?
puts "..."
elseif @names.respond_to?("each")
@names.each do |name|
puts "Hello #{name}!"
end
else
puts "Hello #{@names}!"
end
end
end
if __FILE__ == $0
mg = MegaGreeter.new(["Sally", "Jane", "Bob"])
mg.say_hi
end

That's because you're not exercising the section under @names.nil?

Try: mg = MegaGreeter.new(nil)
You spoiled it ;)
but this is a good way to explain it too...
 
7

7stud 7stud

Perhaps at the "Ruby from other languages" page :

I did a search on the C/C++ page for 'elsif' and it wasn't found.
Ruby isn't the only language that does that.
"Different" would be more like the way bash does it: "elif"

To me 'elif' stands out like a red flag. 'elsif' is a more subtle
differentiation, and I couldn't spot it even though I had the problem
narrowed down to 3 lines of code. The "Ruby in 20 Minutes" tutorial is
obviously geared to the experienced programmer(beginner's don't know
what classes are or what an 'attr_accessor' is), so I would suggest
putting this in the tutorial:

LOOK AT THE ELSIF SYNTAX CAREFULLY--IT'S 'ELSIF' NOT 'ELSEIF'

with the 'E' in elseif in red.
 
7

7stud 7stud

That's because you're not exercising the section under @names.nil?
Try: mg = MegaGreeter.new(nil)
You spoiled it ;)
but this is a good way to explain it too...

What does that have to do with anything?
Good points Stefano, conclusion *always* use "then" :)

My first exposure to Ruby is the "Ruby in 20 Minutes" tutorial. If it's
good practice to always use 'then', how about putting it in the
tutorial?
 
7

7stud 7stud

7stud said:
What does that have to do with anything?

I tried it, and I got an error for the 'elseif'. Why is that? If the
first branch succeeds, why is the elsif branch even evaluated?
 
7

7stud 7stud

7stud said:
I tried it, and I got an error for the 'elseif'. Why is that? If the
first branch succeeds, why is the elsif branch even evaluated?

Hmm...I think I get it: Ruby doesn't realize elseif is another branch,
it just thinks its the next statement after the if statement. But as
far as I know, all if statements are terminated with 'end'.
 
B

Brian Candler

Hmm...I think I get it: Ruby doesn't realize elseif is another branch,
it just thinks its the next statement after the if statement. But as
far as I know, all if statements are terminated with 'end'.

And yours is.

Add some spaces at the front of the 'elseif' line, so that it aligns with
the 'puts "..."' on the line above. Then you'll see how Ruby is interpreting
your code.

Unlike python, Ruby doesn't *force* you to align your source in a particular
way.
 
7

7stud 7stud

Another question. The tutorial says:
Save this file as “ri20min.rbâ€, and run it as “ruby ri20min.rbâ€.

and at the top of the file is the shebang:

#!/usr/bin/env ruby

If you run the program using 'ruby filename', do you need the shebang?
I read something that said you only need the shebang if you want to
execute programs using just the filename, e.g.:

$ HelloWorld.rb

also what does 'env' do? I read the man pages on the env function, and
I can't figure out what it does in the shebang.
 

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,582
Members
45,066
Latest member
VytoKetoReviews

Latest Threads

Top