Forum: Ruby Extending Symbol with #to_str effects Struct.new

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Trans (Guest)
on 2007-06-13 02:37
(Received via mailing list)
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 C. (Guest)
on 2007-06-13 02:52
(Received via mailing list)
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.
Trans (Guest)
on 2007-06-13 04:06
(Received via mailing list)
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.
Yukihiro M. (Guest)
on 2007-06-13 07:33
(Received via mailing list)
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.
Nobuyoshi N. (Guest)
on 2007-06-13 09:19
(Received via mailing list)
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.
This topic is locked and can not be replied to.