[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Can Ruby do this magic... elegantly

J2M

11/12/2006 2:28:00 AM

I would like to be able to be able to include instance methods of a
Struct into a class. e.g.

foo = Struct.new(:attribute, :another_attribute)
bar = foo.new

class Bas

some_ruby_magic

end

So that I can then do

Bas.attribute="a value"
Bas.attribute

Kind of like doing module_functions but that doesn't work inside a
class.
Thanks,
James


12 Answers

Austin Ziegler

11/12/2006 2:44:00 AM

0

On 11/11/06, J2M <james2mccarthy@gmail.com> wrote:
> I would like to be able to be able to include instance methods of a
> Struct into a class. e.g.
>
> foo = Struct.new(:attribute, :another_attribute)
> bar = foo.new
>
> class Bas
>
> some_ruby_magic
>
> end
>
> So that I can then do
>
> Bas.attribute="a value"
> Bas.attribute
>
> Kind of like doing module_functions but that doesn't work inside a
> class.

class Bas
@__struct__ = Struct.new(:attribute, :another_attribute)

class << self
def method_missing(sym, *args)
@__struct__.send(sym, *args) if @__struct__.respond_to?(sym)
end
end
end

That should work.

-austin
--
Austin Ziegler * halostatue@gmail.com * http://www.halo...
* austin@halostatue.ca * http://www.halo...feed/
* austin@zieglers.ca

Ara.T.Howard

11/12/2006 3:21:00 AM

0

Trans

11/12/2006 7:10:00 AM

0


J2M wrote:
> I would like to be able to be able to include instance methods of a
> Struct into a class. e.g.
>
> foo = Struct.new(:attribute, :another_attribute)
> bar = foo.new
>
> class Bas
>
> some_ruby_magic
>
> end
>
> So that I can then do
>
> Bas.attribute="a value"
> Bas.attribute
> Kind of like doing module_functions but that doesn't work inside a
> class.

Foo = Struct.new(:attribute, :another_attribute)

class Bas
extend Foo.to_module
end

Ha! Only if it were so easy! ;-) Actaully if one had access to Ruby's
source it would rather trivial (hint). In anycase to par down Ara's
solution to it's core:

Foo = Struct.new :attribute, :another_attribute

class Bas
class << self
attr_accessor *Foo.members
end
end

Note the use of the constant which eases access by avoiding
(class<<self;self;end).class_eval.

T.

Robert Klemme

11/12/2006 10:41:00 AM

0

J2M wrote:
> I would like to be able to be able to include instance methods of a
> Struct into a class. e.g.
>
> foo = Struct.new(:attribute, :another_attribute)
> bar = foo.new
>
> class Bas
>
> some_ruby_magic
>
> end
>
> So that I can then do
>
> Bas.attribute="a value"
> Bas.attribute
>
> Kind of like doing module_functions but that doesn't work inside a
> class.

I don't know why people make it so complicated. :-) All these are easier
than other approaches suggested so far:

Foo = Struct.new(:attribute, :another_attribute)
class Bas < Foo
end

class Bas < Struct.new(:attribute, :another_attribute)
end

or even

Bas = Struct.new(:attribute, :another_attribute) do
def another_method() end
end

Kind regards

robert

J2M

11/12/2006 12:32:00 PM

0

Robert, T, A & Austin;

A plethora of choices. All while I slept too ;)

Thank you all.
James


dblack

11/12/2006 12:50:00 PM

0

Robert Klemme

11/12/2006 1:28:00 PM

0

dblack@wobblini.net wrote:
> Hi--
>
> On Sun, 12 Nov 2006, Robert Klemme wrote:
>
>> J2M wrote:
>>> I would like to be able to be able to include instance methods of a
>>> Struct into a class. e.g.
>>>
>>> foo = Struct.new(:attribute, :another_attribute)
>>> bar = foo.new
>>>
>>> class Bas
>>>
>>> some_ruby_magic
>>>
>>> end
>>>
>>> So that I can then do
>>>
>>> Bas.attribute="a value"
>>> Bas.attribute
>>>
>>> Kind of like doing module_functions but that doesn't work inside a
>>> class.
>>
>> I don't know why people make it so complicated. :-) All these are
>> easier than other approaches suggested so far:
>>
>> Foo = Struct.new(:attribute, :another_attribute)
>> class Bas < Foo
>> end
>>
>> class Bas < Struct.new(:attribute, :another_attribute)
>> end
>>
>> or even
>>
>> Bas = Struct.new(:attribute, :another_attribute) do
>> def another_method() end
>> end
>
> You're adding instance methods to Bas rather than to Bas's singleton
> class, though. The OP wants to do:
>
> Bas.attribute = "a value"

Oh, ok then I misinterpreted that. I read "include instance methods
into a class" as including them as instance methods. My bad. Sorry for
the noise.

In this particular case, /if/ the aim is to define attribute accessors a
direct definition is probably the easiest solution

class Bas
class <<self
attr_accessor :attribute, :another_attribute
end
end

Regards

robert

J2M

11/12/2006 4:41:00 PM

0

I got the final solution down to this which I think is rather elegant;

class Bas < Struct.new :attribute, :another_attribute
class << self
attr_accessor *Bas.members
end
end

I love this languate; and now really appreciate the power of the
singleton class.

Thanks.


Trans

11/12/2006 5:37:00 PM

0


J2M wrote:
> I got the final solution down to this which I think is rather elegant;
>
> class Bas < Struct.new :attribute, :another_attribute
> class << self
> attr_accessor *Bas.members
> end
> end

class Bas < Struct.new :attribute, :another_attribute
class << self
attr_accessor *members
end
end

Do you realize that you are adding #attribute and #another_attribute at
both the instance level and the class level, and niether will reference
tha same values? I.e.

Bas.attribute = 1
bas = Bas.new
bas.attribute = 2
Bas.attribute #=> 1
bas.attribute #=> 2

T.

Robert Klemme

11/12/2006 7:24:00 PM

0

Trans wrote:
> J2M wrote:
>> I got the final solution down to this which I think is rather elegant;
>>
>> class Bas < Struct.new :attribute, :another_attribute
>> class << self
>> attr_accessor *Bas.members
>> end
>> end
>
> class Bas < Struct.new :attribute, :another_attribute
> class << self
> attr_accessor *members
> end
> end
>
> Do you realize that you are adding #attribute and #another_attribute at
> both the instance level and the class level, and niether will reference
> tha same values? I.e.
>
> Bas.attribute = 1
> bas = Bas.new
> bas.attribute = 2
> Bas.attribute #=> 1
> bas.attribute #=> 2

Also, what is the point in creating a Struct in this case when you're
basically only using member names?

robert