Forum: Ruby "self.class" vs. "(class << self; self; end)"

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.
unknown (Guest)
on 2006-01-24 17:51
(Received via mailing list)
Is there any difference between these?

def test1()
  msg = 'bar'
  self.class.class_eval do
    define_method('foo') { msg }
  end
end

def test2
  msg = 'baz'
  (class << self; self; end).class_eval do
    define_method('foo') { msg }
  end
end

test1
puts foo

test2
puts foo

As far as I can tell, no?

If that's the case, is there any reason the second form seems so much
more common?
Marcin MielżyÅ?ski (Guest)
on 2006-01-24 18:10
(Received via mailing list)
removed_email_address@domain.invalid wrote:

Yes there is a difference.
In the first example You simply reopen a class a define a method for it.
In the second example You reopen an eigenclass (which is a singleton
instance of class object) and then define a method for it.

Ruby returns last evaluated statement which in this case '(class <<
self; self; end)' is eigenclass...

The eigneclass pattern (a metaclass) is a method of creating single
class instances per instances of them. (I dont know if I made it clear
:) )


consider:

def test1()
   msg = 'bar'
   self.class.class_eval do
     p self
     define_method('foo') { msg }
   end
end


def test2
   msg = 'baz'
   (class << self; self; end).class_eval do
     p self
     define_method('foo') { msg }
   end
end


test1
p foo

test2
p foo

output:

Object
"bar"
#<Class:#<Object:0x2859258>>
"baz"

lopex
Jim (Guest)
on 2006-01-24 18:28
(Received via mailing list)
How does one recognize when to use these techniques?
Vivek (Guest)
on 2006-01-24 18:34
(Received via mailing list)
> In the second example You reopen an eigenclass (which is a singleton
> instance of class object) and then define a method for it.
 What exactly do you mean by eigenclass? is it the same as  an
anonymous class created by class<<obj syntax?


>
> Ruby returns last evaluated statement which in this case '(class <<
> self; self; end)' is eigenclass...
>
> The eigneclass pattern (a metaclass) is a method of creating single
> class instances per instances of them. (I dont know if I made it clear :) )

Is this correct.In the first method,we add a method to the class and so
all objects of this class instantiated from the point after calling
test1 will have the method 'foo' .What about objects created before
this point?
But in the second case ,only the object on which we call test1 will
have the method foo defined.
Marcin MielżyÅ?ski (Guest)
on 2006-01-24 18:49
(Received via mailing list)
Vivek wrote:

>  What exactly do you mean by eigenclass? is it the same as  an
> anonymous class created by class<<obj syntax?
>

Yes (but actually I haven't found any eigenclass definintions on the
web, not even on http://eigenclass.org/)


> Is this correct.In the first method,we add a method to the class and so
> all objects of this class instantiated from the point after calling
> test1 will have the method 'foo' .What about objects created before
> this point?

They will respond to those methods (since THEIR class has been changed):

class A
     def meth1
     end
end

a=A.new

class A
     def meth2
     end
end

class A
     define_method :meth3 do
     end
end

a.meth2
a.meth3


lopex
unknown (Guest)
on 2006-01-25 01:54
(Received via mailing list)
On Jan 24, 2006, at 10:49 AM, Marcin MielżyÅ?ski wrote:
> Vivek wrote:
>>  What exactly do you mean by eigenclass? is it the same as  an
>> anonymous class created by class<<obj syntax?
>
> Yes (but actually I haven't found any eigenclass definintions on
> the web, not even on http://eigenclass.org/)

The expression:

	(class <<target; self; end)

evaluates to an instance of Class that has the unique
property that its instance methods are only available to
the object referenced by 'target'.

Traditionally this class has been called target's 'singleton class'.

There has been some community frustration with that particular name
due to other meanings of 'singleton' as well as the existence in the
standard library of a class with the name 'Singleton'; both of which
have nothing to do with the expression above.  Matz has also hinted
that this feature might not be class based in the future, which would of
course make the term 'singleton class' even more confusing.  So
this very useful concept floats around in nomenclature-limbo at the
moment.

Alternative terms have been suggested.  Eigenclass is one of them.



Gary W.
Vivek (Guest)
on 2006-01-25 05:55
(Received via mailing list)
The eigenclass.org even has a favicon.ico  which looks like '<< '  :-)
This topic is locked and can not be replied to.