[#1378] differences between Module and Class ? — Mathieu Bouchard <matju@...>

25 messages 2003/08/11
[#1387] Re: differences between Module and Class ? — matz@... (Yukihiro Matsumoto) 2003/08/12

Hi,

[#1442] Re: differences between Module and Class ? — Mathieu Bouchard <matju@...> 2003/08/21

[#1406] _id2ref bug? — Ryan Pavlik <rpav@...>

While debugging some caching code, I've come across a segfault related

22 messages 2003/08/14
[#1407] Re: _id2ref bug? — matz@... (Yukihiro Matsumoto) 2003/08/14

Hi,

[#1413] Re: _id2ref bug? (REPRODUCED, short) — Ryan Pavlik <rpav@...> 2003/08/14

On Fri, 15 Aug 2003 01:57:18 +0900

Re: Extracting a parent class

From: Mathieu Bouchard <matju@...>
Date: 2003-08-03 17:39:15 UTC
List: ruby-core #1333
On Fri, 1 Aug 2003, Michael Garriss wrote:

> Sorry about the newbie question but....
> class A; attr_accessor :a end
> class B < A; attr_accessor :b end
> b = B.new
> b.a = "some data"
> b.b = "some more data"
> a = b.?????
> How do I set 'a' from 'b' so that a is of class A and not class B?  I 
> don't want the extra info, I want just the subset of members found in 
> the parent class.  Is there a way to cast?

Like most other OO languages, the class of an object is a property of the
object [1] and not of the pointer [2] or of the variable that holds the
pointer [3].

C++ is the only language I know that allows to see an object thru the lens
of its parent classes, but that's usually considered as a consequence of
other things in C++, not so much a feature by itself.

In Ruby, variables don't have classes at all. If you want variable 'a' to
point to an object of class A (such that a.class==A), you have to do:

a = A.new
a.a = b.a

but then 'a' points to a different object than 'b', not a subpart.
(However the string object "some data" is shared between the two.)

If you want to make copying automatic, it is possible to get a list of all
existing accessors for an object like this:

class A
  attr_accessor :a,:b,:c
  def self.get_accessor_list
    list=[]
    instance_methods(true).each {|m| list<<$1 if /(\w+)=$/ =~ m.to_s }
    list
  end
end

A.get_accessor_list

#==>  ["b", "a", "c"]



... and then you can use that to automatically find out what to copy from
one object to another; but maybe copying isn't necessarily what you want,
I don't know.

________________________________________________________________
Mathieu Bouchard                       http://artengine.ca/matju


In This Thread

Prev Next