Struct (not) accepting attributes

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 namesum(value)’
class Sum
define_method(:“sum(value)”) { “summum!” }
end
=> #Proc:0xa7c5f218@:181(irb)
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.

On 18.10.2006 14:33, Kero wrote:

define_method(:“sum(value)”) { “summum!” }
end
=> #Proc:0xa7c5f218@:181(irb)
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

On 10/18/06, Robert K. [email protected] wrote:

class Sum
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

define_method(:“sum(value)”) { “summum!” }
end
=> #Proc:0xa7c5f218@:181(irb)
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 :slight_smile:
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@:21(irb)
irb> sum.send(:“sum(value)”)
=> 5

so why doesn’t Struct? :stuck_out_tongue:

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 :slight_smile:

Bye,
Kero.