[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Traversing superviews' class instance variables

Clint

3/20/2006 6:57:00 AM

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
2 Answers

Ross Bamford

3/20/2006 11:17:00 AM

0

On Mon, 2006-03-20 at 15:58 +0900, Mike Austin wrote:
> 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?
>

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...

--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk



Clint

3/20/2006 8:19:00 PM

0

Ross Bamford wrote:
> On Mon, 2006-03-20 at 15:58 +0900, Mike Austin wrote:
>> 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?
>>
>
> 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