[#3109] Is divmod dangerous? — Dave Thomas <Dave@...>

14 messages 2000/06/06

[#3149] Retrieving the hostname and port in net/http — Roland Jesse <jesse@...>

Hi,

12 messages 2000/06/07

[#3222] Ruby coding standard? — Robert Feldt <feldt@...>

16 messages 2000/06/09

[#3277] Re: BUG or something? — Aleksi Niemel<aleksi.niemela@...>

> |I am new to Ruby and this brings up a question I have had

17 messages 2000/06/12
[#3281] Re: BUG or something? — Dave Thomas <Dave@...> 2000/06/12

Aleksi Niemel<aleksi.niemela@cinnober.com> writes:

[#3296] RE: about documentation — Aleksi Niemel<aleksi.niemela@...>

> I want to contribute to the ruby project in my spare time.

15 messages 2000/06/12

[#3407] Waffling between Python and Ruby — "Warren Postma" <embed@...>

I was looking at the Ruby editor/IDE for windows and was disappointed with

19 messages 2000/06/14

[#3410] Exercice: Translate into Ruby :-) — Jilani Khaldi <jilanik@...>

Hi All,

17 messages 2000/06/14

[#3415] Re: Waffling between Python and Ruby — Andrew Hunt <andy@...>

>Static typing..., hmm,...

11 messages 2000/06/14

[#3453] Re: Static Typing( Was: Waffling between Python and Ruby) — Andrew Hunt <andy@...>

32 messages 2000/06/16

[#3516] Deep copy? — Hugh Sasse Staff Elec Eng <hgs@...>

Given that I cannot overload =, how should I go about ensuring a deep

20 messages 2000/06/19

[#3694] Why it's quiet — hal9000@...

We are all busy learning the new language

26 messages 2000/06/29
[#3703] Re: Why it's quiet — "NAKAMURA, Hiroshi" <nahi@...> 2000/06/30

Hi,

[#3705] Re: Why it's quiet — matz@... (Yukihiro Matsumoto) 2000/06/30

Hi,

[ruby-talk:03431] Re: There is no "main" function in Ruby (?)

From: Dave Thomas <Dave@...>
Date: 2000-06-15 02:28:51 UTC
List: ruby-talk #3431
Jilani Khaldi <jilanik@tin.it> writes:

> So I see there is no "main" function to "init" the program in Ruby.

Aleksi Niemel<aleksi.niemela@cinnober.com> writes:

> When you execute the interpreter by saying something like
> 
>   ruby file_to_execute.rb
> 
> it starts to execute Ruby code in the file. In this case it first executes
> the class definition and then the "invisible main".

Ruby has an execution model which will seem strange coming from C++.

Unlike static languages such as 'C', Ruby executes everything. In C,

   struct { ... }

is a definition. In Ruby

   class ...

   end

is executable code -- it's actually running the class definition. This 
means you can do interesting things. For example, you could change the
to_s method used by a class from a verbose one to a restrained
one. Using conventional thinking, you'd do something like:

  class Fred

     def to_s
       if $VERBOSE
         # ... return large string
       else
         # ... return compact string
     end
  end

The 'if' statement is executed every time you call to_s.

However, if you know that $VERBOSE isn't going to change over the life 
of the program, in Ruby you can do:

  class Fred

    if $VERBOSE
      def to_s
        return 'long................string'
      end
    else
      def to_s
        return 'shortstring'
      end
    end
  end

You actually define one of two different methods depending on the
flag. The 'if' is only executed once.


> So actually the main in Ruby is a little bit like in Java. If you write
> something to top-level it gets executed, but usually it's better to write

I thought Java looked for a 'static void final main(String args[])' in 
a class of the same name as the class given to the interpreter, but
it's been a while (thankfully).


> if __FILE__ == $0
>    # the contents of main
> end

This idiom is not required at all for normal Ruby programs. It's a
trick used by library routine writers that want to include their own
test code in the same file as the library.

If they are included as a library, $0 (the name of the program that's
running) won't be the same as __FILE__, the name of the library
file. The code won't then get executed.

However, run the library as a standalone program, and the two match,
so the test code gets executed.

You don't need this idiom for normal programs.

> There should be the better way (tm). Show me the light.

Don't use it! Seriously - you normally don't have to.

If you don't like it and you _do_ need some kind of self test
capability, you could always do it other ways. For example, create a
library called SelfTest.rb, which contains

   $SelfTest = true


In your other libraries, have

   if $SelfTest
     # code to perform test
   end

Then, to enable the self test, use:


  ruby -r SelfTest  mylibrary.rb


However, __FILE__ == $0 is pretty much an idiom, and people are pretty 
much used to it by now.


Regards


Dave

In This Thread