elseif v. elsif ??

Discussion in 'Ruby' started by 7stud 7stud, Mar 7, 2007.

  1. 7stud 7stud

    7stud 7stud Guest

    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

    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #1
    1. Advertising

  2. 7stud 7stud

    Chad Perrin Guest

    On Wed, Mar 07, 2007 at 05:56:56PM +0900, 7stud 7stud wrote:
    >
    > 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"

    --
    CCD CopyWrite Chad Perrin [ http://ccd.apotheon.org ]
    "There comes a time in the history of any project when it becomes necessary
    to shoot the engineers and begin production." - MacUser, November 1990
    Chad Perrin, Mar 7, 2007
    #2
    1. Advertising

  3. 7stud 7stud

    Robert Dober Guest

    On 3/7/07, 7stud 7stud <> wrote:
    > 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
    >
    >
    > 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
    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >



    --
    We have not succeeded in answering all of our questions.
    In fact, in some ways, we are more confused than ever.
    But we feel we are confused on a higher level and about more important things.
    -Anonymous
    Robert Dober, Mar 7, 2007
    #3
  4. On Mar 7, 9:56 am, 7stud 7stud <> wrote:
    > 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
    >
    > --
    > Posted viahttp://www.ruby-forum.com/.


    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?

    --
    Hans
    Hans Sjunnesson, Mar 7, 2007
    #4
  5. 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
    Stefano Crocco, Mar 7, 2007
    #5
  6. 7stud 7stud

    Robert Dober Guest

    On 3/7/07, Hans Sjunnesson <> wrote:
    > On Mar 7, 9:56 am, 7stud 7stud <> wrote:
    > > 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
    > >
    > > --
    > > Posted viahttp://www.ruby-forum.com/.

    >
    > 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?
    >
    > --
    > Hans
    >
    >
    >

    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


    --
    We have not succeeded in answering all of our questions.
    In fact, in some ways, we are more confused than ever.
    But we feel we are confused on a higher level and about more important things.
    -Anonymous
    Robert Dober, Mar 7, 2007
    #6
  7. 7stud 7stud

    Chris Lowis Guest

    Chris Lowis, Mar 7, 2007
    #7
  8. 7stud 7stud

    Robert Dober Guest

    On 3/7/07, Stefano Crocco <> wrote:
    <snip>

    Good points Stefano, conclusion *always* use "then" :)
    --
    We have not succeeded in answering all of our questions.
    In fact, in some ways, we are more confused than ever.
    But we feel we are confused on a higher level and about more important things.
    -Anonymous
    Robert Dober, Mar 7, 2007
    #8
  9. 7stud 7stud

    7stud 7stud Guest

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

    >
    > 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


    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #9
  10. 7stud 7stud

    7stud 7stud Guest

    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]

    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #10
  11. On Wed, Mar 07, 2007 at 07:54:15PM +0900, 7stud 7stud wrote:
    > 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)
    Brian Candler, Mar 7, 2007
    #11
  12. 7stud 7stud

    Robert Dober Guest

    On 3/7/07, 7stud 7stud <> wrote:
    > 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]
    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    >


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

    Robert
    --
    We have not succeeded in answering all of our questions.
    In fact, in some ways, we are more confused than ever.
    But we feel we are confused on a higher level and about more important things.
    -Anonymous
    Robert Dober, Mar 7, 2007
    #12
  13. 7stud 7stud

    Robert Dober Guest

    On 3/7/07, Brian Candler <> wrote:
    > On Wed, Mar 07, 2007 at 07:54:15PM +0900, 7stud 7stud wrote:
    > > 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...

    --
    We have not succeeded in answering all of our questions.
    In fact, in some ways, we are more confused than ever.
    But we feel we are confused on a higher level and about more important things.
    -Anonymous
    Robert Dober, Mar 7, 2007
    #13
  14. 7stud 7stud

    7stud 7stud Guest

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


    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.


    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #14
  15. On Wed, Mar 07, 2007 at 08:05:14PM +0900, Robert Dober wrote:
    > >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...


    and a good argument for code coverage testing (e.g. rcov)
    Brian Candler, Mar 7, 2007
    #15
  16. 7stud 7stud

    7stud 7stud Guest

    >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?

    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #16
  17. 7stud 7stud

    7stud 7stud Guest

    7stud 7stud wrote:
    >>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?
    >


    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?

    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #17
  18. 7stud 7stud

    7stud 7stud Guest

    7stud 7stud wrote:
    > 7stud 7stud wrote:
    >>>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?
    >>

    >
    > 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'.


    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #18
  19. On Wed, Mar 07, 2007 at 08:28:43PM +0900, 7stud 7stud wrote:
    > > 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'.


    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.
    Brian Candler, Mar 7, 2007
    #19
  20. 7stud 7stud

    7stud 7stud Guest

    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.

    --
    Posted via http://www.ruby-forum.com/.
    7stud 7stud, Mar 7, 2007
    #20
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Leon

    ElseIF or Case Statement?

    Leon, Dec 16, 2004, in forum: ASP .Net
    Replies:
    5
    Views:
    474
    Dan Bass
    Dec 17, 2004
  2. unexpected

    Avoiding if..elsif statements

    unexpected, Aug 25, 2006, in forum: Python
    Replies:
    11
    Views:
    569
    Tal Einat
    Aug 27, 2006
  3. simonced

    elseif problem

    simonced, Jun 2, 2006, in forum: Ruby
    Replies:
    7
    Views:
    125
    simonced
    Jun 3, 2006
  4. planetthoughtful

    Newbie: if / elseif

    planetthoughtful, Mar 14, 2007, in forum: Ruby
    Replies:
    10
    Views:
    204
    Chad Perrin
    Mar 16, 2007
  5. fl
    Replies:
    6
    Views:
    360
    HT-Lab
    Feb 28, 2013
Loading...

Share This Page