Extending Symbol with #to_str effects Struct.new

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

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

That in itself seems silly.

T.

···

from :0
        from :0

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.

···

On 6/12/07, Trans <transfire@gmail.com> 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.

--
Chris Carter
concentrationstudios.com
brynmawrcs.com

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.

···

On Jun 12, 6:51 pm, "Chris Carter" <cdcar...@gmail.com> wrote:

On 6/12/07, Trans <transf...@gmail.com> 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.

Hi,

At Wed, 13 Jun 2007 07:51:59 +0900,
Chris Carter 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.

···

--
Nobu Nakada

Hi,

···

In message "Re: Extending Symbol with #to_str effects Struct.new" on Wed, 13 Jun 2007 09:05:54 +0900, Trans <transfire@gmail.com> 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.