Forum: Ruby Code explanation requeted

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ab5d0d66db7c70b5634be1e28e614383?d=identicon&s=25 Neville Franks (nevf)
on 2007-02-06 00:32
Hi, Can someone please shed some light on the following code:

---
  def test_listen
    s = nil
    log = Object.new
    class << log; self end.__send__(:define_method, :to_int) {
      s.close
      2
    }
    inet_stream do |s|
      assert_raise(IOError) {
        s.listen(log)
      }
    end
  end
---

In particular the "class" statement and "self
end.__send__(:define_method, :to_int)"

Is this actually a class and where is its "end"?

I didn't know you can have a class inside a method. So I'm confused here
as well.

This code is messing up the Ruby parser I'm working on in my IDE.

---
Neville Franks, http://www.getsoft.com http://www.surfulater.com
1fba4539b6cafe2e60a2916fa184fc2f?d=identicon&s=25 unknown (Guest)
on 2007-02-06 01:06
(Received via mailing list)
Hi --

On Tue, 6 Feb 2007, Neville Franks wrote:

>    inet_stream do |s|
> Is this actually a class and where is its "end"?
It is a class; it's the singleton class of log.  You may join the club
of people who want a singleton_class method :-)  That would make it:

   log.singleton_class.__send__(:define_method, :to_int) ...

As it stands, in order to address the singleton class as an object,
you have to capture it through the technique of:

   class << log
     self
   end

What you're seeing in the code you've got is this, but strung together
on one line without much to help you parse it visually if you don't
already know what to expect.  I would tend to write it as:

   (class << log; self; end).__send__  etc.


David
Ab5d0d66db7c70b5634be1e28e614383?d=identicon&s=25 Neville Franks (nevf)
on 2007-02-06 04:15
unknown wrote:
> ..
> What you're seeing in the code you've got is this, but strung together
> on one line without much to help you parse it visually if you don't
> already know what to expect.  I would tend to write it as:
>
>    (class << log; self; end).__send__  etc.
>
>
> David

Thanks David. And there I was thinking us C++ folks were good at writing
incomprehsible code. :-)

---
Neville Franks, http://www.getsoft.com http://www.surfulater.com
617b624fa01db9f6440439f3740b35e9?d=identicon&s=25 Marcello Barnaba (Guest)
on 2007-02-06 19:58
(Received via mailing list)
On Tuesday 06 February 2007 04:15, Neville Franks wrote:
> >    (class << log; self; end).__send__  etc.

> Thanks David. And there I was thinking us C++ folks were good at writing
> incomprehsible code. :-)

:) i know it may sound overkill, but if you really want to understand
what the
heck these singleton/eigen classes are, this one is for you:

http://rhg.rubyforge.org/chapter04.html

but maybe you should also read the previous chapters as well, it
shouldn't
take more than some hours to have the big picture clear in your mind.

the documentation is based upon ruby 1.7.3, IIRC, and I don't know
what's
changed later, but I'm sure that the overall cleanness of MRI hasn't
been
altered :).


def post_scriptum; puts yield end
post_scriptum do %{
 hello list! this is my first post!
 lurking from some months, I learned a lot from you all!
 thanks!
} end
E7559e558ececa67c40f452483b9ac8c?d=identicon&s=25 unknown (Guest)
on 2007-09-25 23:10
(Received via mailing list)
On Feb 5, 2007, at 6:39 PM, dblack@wobblini.net wrote:
> What you're seeing in the code you've got is this, but strung together
> on one line without much to help you parse it visually if you don't
> already know what to expect.  I would tend to write it as:
>
>   (class << log; self; end).__send__  etc.

I'd add that

   __send__(:define_method, :to_int)

is used instead of simply:

   define_method(:to_int)

to override the private status of 'define_method'.

Gary Wright
This topic is locked and can not be replied to.