From: Kero Date: 2006-10-19T22:00:12+09:00 Subject: Re: Struct (not) accepting attributes >>> Sum = Struct.new(:bla, :"sum(value)") >>> sum = Sum.new(2, 5) >> => # >>> sum.send(:"sum(value)") >> NoMethodError: undefined method `sum(value)' for # >>> class X >>> attr_accessor :"sum(value)" >>> end >> NameError: invalid attribute name `sum(value)' >>> class Sum >>> define_method(:"sum(value)") { "summum!" } >>> end >> => # >>> 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 => # irb> sum.send(:"sum(value)") => 5 so why doesn't Struct? :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.