Extending Symbol with #to_str effects Struct.new


#1

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.


#2

On 6/12/07, Trans removed_email_address@domain.invalid wrote:

Struct.new(‘x’)

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.


#3

On Jun 12, 6:51 pm, “Chris C.” removed_email_address@domain.invalid wrote:

end
Is it really THAT unreasonable an extension? I wonder what else it

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.


#4

Hi,

In message “Re: Extending Symbol with #to_str effects Struct.new”
on Wed, 13 Jun 2007 09:05:54 +0900, Trans removed_email_address@domain.invalid
writes:

|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?

Historical Reason. Compatibility caused this.

          matz.

#5

Hi,

At Wed, 13 Jun 2007 07:51:59 +0900,
Chris C. wrote in [ruby-talk:255405]:

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.

You may know, it can be disabled by passing nil as the first
argument, so that anonymous Struct will be created.