From: Trans Date: 2007-06-13T09:05:54+09:00 Subject: Re: Extending Symbol with #to_str effects Struct.new On Jun 12, 6:51 pm, "Chris Carter" wrote: > On 6/12/07, Trans wrote: > > > > > Not arguing either way a s to whether this makes sense or not (it's > > had it's lengthy discussions before). > > > > class Symbol > > > def to_str > > > String(self) > > > end > > > end > > > But it does cause this strangeness: > > > > Struct.new(:x) > > NameError: identifier x needs to be constant > > from (irb):6:in `new' > > from (irb):6 > > from :0 > > > Is it really THAT unreasonable an extension? I wonder what else it > > would effect, and why. I don't really even understand the error > > message, but one gets the same result with: > > > > Struct.new('x') > > NameError: identifier x needs to be constant > > from (irb):1:in `new' > > from (irb):1 > > from :0 > > > That in itself seems silly. > > > T. > > This is because if Struct gets a String or a "string like object > (responds_to? :to_str)" it uses an alternate behavior where the first > argument, if a proper Constant name in a string, is defined to be the > Struct class generated under the Struct:: namespace. Okay. Thanks. I get the error now. Though, I don't really get how this alternate behavior is useful. Why would one want to use the Struct namespace? And if you did, what's wrong with Struct::MyStruct = Struct.new( ... ) But the main thing, differentiating functionality based on String vs. Symbol is just generally a bad idea. And very bad in core libs, IMHO. T.