Forum: Ruby Traversing superviews' class instance variables

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.
Mike A. (Guest)
on 2006-03-20 09:00
(Received via mailing list)
I have certain variables that are 'properties' and I keep track of them
in a
class instance variable called @fields, and each subclass may have it's
own
fields.  I want to navigate through the hierarchy and go through each
list, is
something like this possible?:

class View
   @fields = [:origin]
   def View.fields()
     super.fields()
     @fields
   end
   attr :origin
end

class Button < View
   @fields = [:caption]
   attr :caption
end

View.fields() actually finds :cation when I do Button.fields(), but
super does
not work.  Or maybe there is another way to do this?


Thanks,
Mike
Ross B. (Guest)
on 2006-03-20 13:18
(Received via mailing list)
On Mon, 2006-03-20 at 15:58 +0900, Mike A. wrote:
>    end
>
It seems to work if you replace View.fields with:

def View.fields
  @fields + (superclass.respond_to?(:fields) ? superclass.fields : [])
end

But this seems like a bit of a strange setup to me...
Mike A. (Guest)
on 2006-03-20 22:18
(Received via mailing list)
Ross B. wrote:
>>      @fields
>> not work.  Or maybe there is another way to do this?
>>
>
> It seems to work if you replace View.fields with:
>
> def View.fields
>   @fields + (superclass.respond_to?(:fields) ? superclass.fields : [])
> end
>
> But this seems like a bit of a strange setup to me...

Thanks, that works.  It is strange, but it's the best way I see to
classify
instance variables as being 'public properties' or not.  Here's an
example of
how it will be used:

class View
   @fields = [:origin, :extent]
   [...]

   def View.fields()
     @fields + (superclass != Object ? superclass.fields : [])
   end

   def View.inherited( subclass )
     subclass.class_eval do
       @fields = []   # Make subclasses have @fields
     end
   end
end

class Button < View
   @fields = [:action]
   [...]
end

puts Button.fields


Have a good one,
Mike
This topic is locked and can not be replied to.