How to get class of BasicObject ancestor (Ruby 1.9.2)?

Discussion in 'Ruby' started by Alexey Petrushin, Mar 6, 2011.

  1. There's no :class method on BasicObject, is there any way to get class
    of it's ancestors?

    class SomeUtilityClassBase < BasicObject
    def clone
    clone = self.class.new # <= problem here, there's no way to get
    :class
    ...
    return clone
    end
    end

    class Config < SomeUtilityClassBase
    end

    a = Config.new
    b = a.clone

    Thanks.

    --
    Posted via http://www.ruby-forum.com/.
     
    Alexey Petrushin, Mar 6, 2011
    #1
    1. Advertising

  2. On Sun, Mar 6, 2011 at 3:09 PM, Alexey Petrushin <> wrote:
    > There's no :class method on BasicObject, is there any way to get class
    > of it's ancestors?


    Here's one way:

    module DefineClass
    def self.included(other)
    other.class_eval {
    define_method :class do
    other
    end
    }
    end
    end

    class SO < BasicObject
    include ::DefineClass

    @@counter = 0
    def initialize(*a, &b)
    super
    @@counter += 1
    end

    def clone
    clone = self.class.new
    end

    def inspect
    "<#{self.class}: #{@@counter}>"
    end
    end

    s = SO.new
    p s.clone

    # => <SO: 2>

    (I'm not a huge fan of @@class_variables in general - it's just here
    to make the point that there are two different instances.)

    Regards,
    Sean
     
    Sean O'Halpin, Mar 6, 2011
    #2
    1. Advertising

  3. Alexey Petrushin

    7stud -- Guest

    You can inherit from BlankSlate instead of BasicObject, which was
    modeled after BlankSlate, and call YourClassName.reveal:)class) to
    enable the class method.

    --
    Posted via http://www.ruby-forum.com/.
     
    7stud --, Mar 6, 2011
    #3
  4. Alexey Petrushin

    7stud -- Guest

    ...or even simpler: just open up BasicObject and monkeypatch a class
    method called class(untested):

    class BasicObject
    def self.class
    self
    end
    end

    Then have at it.

    --
    Posted via http://www.ruby-forum.com/.
     
    7stud --, Mar 6, 2011
    #4
  5. Alexey Petrushin

    7stud -- Guest

    7stud -- wrote in post #985807:
    > If you inherit from BlankSlate instead of BasicObject. The advantage
    > of doing that is that BlankSlate has a class method called reveal(),
    > which you can use to incrementally roll back your BlankSlate. In your
    > case, you would call YourClassName.reveal:)class) to
    > enable the class method.


    That last line should be:

    "enable the :class instance method"

    and the first line should read:

    "You can inherit from BlankSlate instead of BasicObject."

    --
    Posted via http://www.ruby-forum.com/.
     
    7stud --, Mar 6, 2011
    #5
  6. BasicObject as a singleton already has the class method (and it returns =
    Class, as expected).
    You meant to suggest something like this:

    class BasicObject
    def class
    BasicObject
    end
    end

    But that would make any subclass of BasicObject that doesn't override =
    this #class definition
    would return BasicObject, which would be odd. I'm not sure of a =
    pure-ruby way to write #class,
    it's definitely written in C for the Object class.

    Michael Edgar

    http://carboni.ca/

    On Mar 6, 2011, at 4:21 PM, 7stud -- wrote:

    > ...or even simpler: just open up BasicObject and monkeypatch a class=20=


    > method called class(untested):
    >=20
    > class BasicObject
    > def self.class
    > self
    > end
    > end
    >=20
    > Then have at it.
    >=20
    > --=20
    > Posted via http://www.ruby-forum.com/.
    >=20
     
    Michael Edgar, Mar 6, 2011
    #6
  7. > I'm not sure of a pure-ruby way to write #class,
    > it's definitely written in C for the Object class.


    Here's another attempt (this time handling inheritance):

    module DefineClass
    def self.define_class(klass)
    klass.class_eval {
    define_method :class do
    klass
    end
    }
    end
    def self.extended(other)
    define_class(other)
    end
    def inherited(other)
    DefineClass.define_class(other)
    end
    end

    class SO < BasicObject
    extend ::DefineClass

    @@counter = 0
    def initialize(*a, &b)
    super
    @@counter += 1
    end

    def clone
    clone = self.class.new
    end

    def inspect
    "<#{self.class}: #{@@counter}>"
    end
    end

    s = SO.new
    p s.clone
    # => <SO: 2>

    class BO < SO
    end

    b = BO.new
    p b.clone
    # => <BO: 4>

    Regards,
    Sean
     
    Sean O'Halpin, Mar 6, 2011
    #7
  8. On Sun, Mar 6, 2011 at 9:21 PM, 7stud -- <> wrote:
    > ...or even simpler: just open up BasicObject and monkeypatch a class
    > method called class(untested):

    !
    > class BasicObject
    > =A0def self.class
    > =A0 =A0self
    > =A0end
    > end
    >
    > Then have at it.


    You've changed the #class method of the BasicObject /class/, not the /insta=
    nce/.
    So BasicObject.class will now return BasicObject (rather than Class)
    and BasicObject.new.class will not work.

    Regards,
    Sean
     
    Sean O'Halpin, Mar 6, 2011
    #8
  9. Thanks for advices, good news for me is that I have small amount of
    ancestors, so for now I just hardcoded it's class names.

    In my case using :inherited callback magic is too over engineered
    solution :)

    --
    Posted via http://www.ruby-forum.com/.
     
    Alexey Petrushin, Mar 7, 2011
    #9
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Luis P. Mendes
    Replies:
    3
    Views:
    366
    Bruno Desthuilliers
    Sep 15, 2006
  2. Wes Gamble
    Replies:
    3
    Views:
    91
    Pit Capitain
    Jul 12, 2006
  3. Michael Fellinger
    Replies:
    3
    Views:
    186
    Michael Fellinger
    Dec 27, 2007
  4. Intransition
    Replies:
    4
    Views:
    133
    Xavier Noria
    Aug 31, 2010
  5. harryajh
    Replies:
    4
    Views:
    288
    Thomas 'PointedEars' Lahn
    Feb 1, 2008
Loading...

Share This Page