[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Extending Symbol with #to_str effects Struct.new

Trans

6/12/2007 10:36:00 PM

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.


3 Answers

Chris Carter

6/12/2007 10:52:00 PM

0

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

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.

--
Chris Carter
concentrationstudios.com
brynmawrcs.com

Trans

6/13/2007 12:06:00 AM

0



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.

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.


Nobuyoshi Nakada

6/13/2007 5:18:00 AM

0

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