Code explanation requeted

N

Neville Franks

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

dblack

Hi --

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

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

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

gwtmp01

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
 
N

Neville Franks

unknown said:
..
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. :)
 
M

Marcello Barnaba

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
 

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

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top