"self.class" vs. "(class << self; self; end)"

Discussion in 'Ruby' started by ssmoot, Jan 22, 2006.

  1. ssmoot

    ssmoot Guest

    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?
     
    ssmoot, Jan 22, 2006
    #1
    1. Advertisements

  2. 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
     
    Marcin Mielżyński, Jan 22, 2006
    #2
    1. Advertisements

  3. ssmoot

    Jim Guest

    How does one recognize when to use these techniques?
     
    Jim, Jan 22, 2006
    #3
  4. ssmoot

    Vivek Guest

    In the second example You reopen an eigenclass (which is a singleton
    What exactly do you mean by eigenclass? is it the same as an
    anonymous class created by class<<obj syntax?

    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.
     
    Vivek, Jan 23, 2006
    #4
  5. Yes (but actually I haven't found any eigenclass definintions on the
    web, not even on http://eigenclass.org/)

    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
     
    Marcin Mielżyński, Jan 23, 2006
    #5
  6. ssmoot

    gwtmp01 Guest

    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 Wright
     
    gwtmp01, Jan 24, 2006
    #6
  7. ssmoot

    Vivek Guest

    The eigenclass.org even has a favicon.ico which looks like '<< ' :)
     
    Vivek, Jan 25, 2006
    #7
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.