Is it possible to change the class of a Ruby object?

后端 未结 3 1133
-上瘾入骨i
-上瘾入骨i 2021-01-18 03:41

Is it possible to change the class of a Ruby object once it has been instantiated, something like:

class A
end

class B
end

a = A.new
a.class = B

相关标签:
3条回答
  • 2021-01-18 03:46

    When I needed to convert from the built-in String class to a custom class called MyString, I did it via the following:

    class MyString < String
      #Class body here
    end
    
    class String
      def to_MyS
        MyString.new self
      end
    end
    
    foo = "bar"
    puts foo.class #=> String
    
    foo = foo.to_MyS
    puts foo.class #=> MyString
    
    0 讨论(0)
  • 2021-01-18 03:56

    simple answer, no:

    NoMethodError: undefined method `class=' for #<A:0x91a758>
    

    however you can delete methods and mix in modules and such so as to leave an object that looks totally different...

    0 讨论(0)
  • 2021-01-18 03:58

    No, this is not possible from within ruby.

    It is theoretically possible from within a C extension by changing the klass pointer of the given object, but it should be noted that this will be completely implementation-specific, will not work for immediate types (i.e. you definitely can't change the class of e.g. a fixnum), and might blow up in various ways.

    0 讨论(0)
提交回复
热议问题