[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Struct (not) accepting attributes

Kero van Gelder

10/18/2006 12:33:00 PM

> Sum = Struct.new(:bla, :"sum(value)")
> sum = Sum.new(2, 5)
=> #<struct Sum bla=2, :"sum(value)"=5>
> sum.send(:"sum(value)")
NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
> class X
> attr_accessor :"sum(value)"
> end
NameError: invalid attribute name `sum(value)'
> class Sum
> define_method(:"sum(value)") { "summum!" }
> end
=> #<Proc:0xa7c5f218@(irb):181>
> sum.send(:"sum(value)")
=> "summum!"

Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).
And yes, I know how to get/set the value anyway:

> sum[:"sum(value)"]
=> 5
> sum["sum(value)"] = 42
=> 42

Bye,
Kero.
3 Answers

Robert Klemme

10/18/2006 12:39:00 PM

0

On 18.10.2006 14:33, Kero wrote:
>> Sum = Struct.new(:bla, :"sum(value)")
>> sum = Sum.new(2, 5)
> => #<struct Sum bla=2, :"sum(value)"=5>
>> sum.send(:"sum(value)")
> NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
>> class X
>> attr_accessor :"sum(value)"
>> end
> NameError: invalid attribute name `sum(value)'
>> class Sum
>> define_method(:"sum(value)") { "summum!" }
>> end
> => #<Proc:0xa7c5f218@(irb):181>
>> sum.send(:"sum(value)")
> => "summum!"
>
> Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).

There is another option: a misunderstanding on your side which attribute
names can be used in this situation / generally. As you see your sample
class X does not work either.

Why don't you just use "sum_value" as attribute name?

Kind regards

robert

Jano Svitok

10/18/2006 1:16:00 PM

0

On 10/18/06, Robert Klemme <shortcutter@googlemail.com> wrote:
> On 18.10.2006 14:33, Kero wrote:
> >> Sum = Struct.new(:bla, :"sum(value)")
> >> sum = Sum.new(2, 5)
> > => #<struct Sum bla=2, :"sum(value)"=5>
> >> sum.send(:"sum(value)")
> > NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
> >> class X
> >> attr_accessor :"sum(value)"
> >> end
> > NameError: invalid attribute name `sum(value)'
> >> class Sum
> >> define_method(:"sum(value)") { "summum!" }
> >> end
> > => #<Proc:0xa7c5f218@(irb):181>
> >> sum.send(:"sum(value)")
> > => "summum!"
> >
> > Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).
>
> There is another option: a misunderstanding on your side which attribute
> names can be used in this situation / generally. As you see your sample
> class X does not work either.
>
> Why don't you just use "sum_value" as attribute name?
>
> Kind regards
>
> robert

sum(value) is not a valid method name. method names must match (I
believe) /[a-z_][a-zA-z0-9_]+[?!]?/

if you want to have a struct with additional method do this:

class Sum < Struct.new(:blah)
def sum(value)
...
end
end

Kero van Gelder

10/19/2006 1:00:00 PM

0

>>> Sum = Struct.new(:bla, :"sum(value)")
>>> sum = Sum.new(2, 5)
>> => #<struct Sum bla=2, :"sum(value)"=5>
>>> sum.send(:"sum(value)")
>> NoMethodError: undefined method `sum(value)' for #<struct Sum bla=2, :"sum(value)"=5>
>>> class X
>>> attr_accessor :"sum(value)"
>>> end
>> NameError: invalid attribute name `sum(value)'
>>> class Sum
>>> define_method(:"sum(value)") { "summum!" }
>>> end
>> => #<Proc:0xa7c5f218@(irb):181>
>>> sum.send(:"sum(value)")
>> => "summum!"
>>
>> Not sure this is an error in ruby (1.8.5) or a misunderstanding from me (about Struct).
>
> There is another option: a misunderstanding on your side which attribute
> names can be used in this situation / generally. As you see your sample
> class X does not work either.

class X throws an Exception, Struct.new does not.
1) Because Struct does not use attributes
2) because it only lost one way (not both) to access the value for my obscure
symbol name.

But the define_method *does* work :)
I can call it w/ #send !
So I can not do

irb> class Sum
irb> define_method(:"sum(value)") { instance_variable_get("@sum(value)") }
irb> end
irb> sum.send(:"sum(value)")
NameError: `@sum(value)' is not allowed as an instance variable name

but I can do

irb> class Sum
irb> define_method(:"sum(value)") { self["sum(value)"] }
irb> end
=> #<Proc:0xa7c6535c@(irb):21>
irb> sum.send(:"sum(value)")
=> 5

so <pedantic> why doesn't Struct? </pedantic> :P

also, `ruby -dw` does not give a warning for Struct.new(:bla, :"sum(value)").

> Why don't you just use "sum_value" as attribute name?

Because "sum(value)" is generated by an SQL query.

I can't do record_from_db.sum(value), and obviously resolving to #send is
both too verbose and something I do not desire to explain to anyone as a
proper API. So record_from_db["sum(value)"] suits me fine.

This post is food for thought, if anything :)

Bye,
Kero.