[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Frozen OpenStruct allows modification

bhz

2/14/2009 12:34:00 PM

Why does OpenStruct allow modification after it has been frozen? Output is
20 in both ruby 1.8.6 and 1.9:

require 'ostruct'

a = OpenStruct.new()
a.foo = 10
a.freeze()
a.foo = 20
puts a.foo
9 Answers

Stefan Lang

2/14/2009 11:18:00 PM

0

2009/2/14 bhz <bhznospam@yahoo.com>:
> Why does OpenStruct allow modification after it has been frozen? Output is
> 20 in both ruby 1.8.6 and 1.9:
>
> require 'ostruct'
>
> a = OpenStruct.new()
> a.foo = 10
> a.freeze()
> a.foo = 20
> puts a.foo

Because the OpenStruct instance is never modified here,
only the internal hash it uses to store attribute values.
The internal hash is not frozen, only the OpenStruct instance
itself.

Stefan

Robert Klemme

2/14/2009 11:59:00 PM

0

On 15.02.2009 00:18, Stefan Lang wrote:
> 2009/2/14 bhz <bhznospam@yahoo.com>:
>> Why does OpenStruct allow modification after it has been frozen? Output is
>> 20 in both ruby 1.8.6 and 1.9:
>>
>> require 'ostruct'
>>
>> a = OpenStruct.new()
>> a.foo = 10
>> a.freeze()
>> a.foo = 20
>> puts a.foo
>
> Because the OpenStruct instance is never modified here,
> only the internal hash it uses to store attribute values.
> The internal hash is not frozen, only the OpenStruct instance
> itself.

That could still be considered a bug and IMHO it is.

Kind regards

robert

Robert Dober

2/15/2009 12:01:00 AM

0

On Sun, Feb 15, 2009 at 12:18 AM, Stefan Lang
<perfectly.normal.hacker@gmail.com> wrote:

> Because the OpenStruct instance is never modified here,
> only the internal hash it uses to store attribute values.
> The internal hash is not frozen, only the OpenStruct instance
Sounds like a bug to me.
Robert

--
It is change, continuing change, inevitable change, that is the
dominant factor in society today. No sensible decision can be made any
longer without taking into account not only the world as it is, but
the world as it will be ... ~ Isaac Asimov

bhz

2/15/2009 9:35:00 AM

0

On Sun, 15 Feb 2009 00:59:20 +0100, Robert Klemme wrote:

> On 15.02.2009 00:18, Stefan Lang wrote:
>> 2009/2/14 bhz <bhznospam@yahoo.com>:
>>> Why does OpenStruct allow modification after it has been frozen? Output is
>>> 20 in both ruby 1.8.6 and 1.9:
>>>
>>> require 'ostruct'
>>>
>>> a = OpenStruct.new()
>>> a.foo = 10
>>> a.freeze()
>>> a.foo = 20
>>> puts a.foo
>>
>> Because the OpenStruct instance is never modified here,
>> only the internal hash it uses to store attribute values.
>> The internal hash is not frozen, only the OpenStruct instance
>> itself.
>
> That could still be considered a bug and IMHO it is.
>
> Kind regards
>
> robert

Agreed.

Robert Dober

2/15/2009 10:38:00 AM

0

On Sun, Feb 15, 2009 at 10:43 AM, bhz <bhznospam@yahoo.com> wrote:
I have submitted a patch to ruby-core.

Turned out that this was certainly an error only *already* created
write accessors were ignoring the frozen? state of the object, thus

x =OpenStruct::new.freeze
x.a = 42

would have thrown the expected TypeError.

Cheers
Robert



--
There are some people who begin the Zoo at the beginning, called
WAYIN, and walk as quickly as they can past every cage until they get
to the one called WAYOUT, but the nicest people go straight to the
animal they love the most, and stay there. ~ A.A. Milne (from
Winnie-the-Pooh)

Robert Klemme

2/15/2009 5:09:00 PM

0

On 15.02.2009 11:38, Robert Dober wrote:
> On Sun, Feb 15, 2009 at 10:43 AM, bhz <bhznospam@yahoo.com> wrote:
> I have submitted a patch to ruby-core.

Well done!

> Turned out that this was certainly an error only *already* created
> write accessors were ignoring the frozen? state of the object, thus
>
> x =OpenStruct::new.freeze
> x.a = 42
>
> would have thrown the expected TypeError.

Thanks for the update and the insights!

Kind regards

robert

bhz

2/17/2009 8:35:00 AM

0

On Sun, 15 Feb 2009 05:38:10 -0500, Robert Dober wrote:

> On Sun, Feb 15, 2009 at 10:43 AM, bhz <bhznospam@yahoo.com> wrote:
> I have submitted a patch to ruby-core.
>
> Turned out that this was certainly an error only *already* created
> write accessors were ignoring the frozen? state of the object, thus
>
> x =OpenStruct::new.freeze
> x.a = 42
>
> would have thrown the expected TypeError.
>
> Cheers
> Robert

Thanks for input. So we can expect it to be fixed in the new release?

Robert Dober

2/17/2009 11:43:00 AM

0

On Tue, Feb 17, 2009 at 9:34 AM, bhz <bhznospam@yahoo.com> wrote:
> On Sun, 15 Feb 2009 05:38:10 -0500, Robert Dober wrote:
>
>> On Sun, Feb 15, 2009 at 10:43 AM, bhz <bhznospam@yahoo.com> wrote:
>> I have submitted a patch to ruby-core.
>>
>> Turned out that this was certainly an error only *already* created
>> write accessors were ignoring the frozen? state of the object, thus
>>
>> x =OpenStruct::new.freeze
>> x.a = 42
>>
>> would have thrown the expected TypeError.
>>
>> Cheers
>> Robert
>
> Thanks for input. So we can expect it to be fixed in the new release?
>
>
I really do not know, depends if my patch or Joel's will be accepted,
but I see no reason why not ;).
R.



--
There are some people who begin the Zoo at the beginning, called
WAYIN, and walk as quickly as they can past every cage until they get
to the one called WAYOUT, but the nicest people go straight to the
animal they love the most, and stay there. ~ A.A. Milne (from
Winnie-the-Pooh)

Robert Dober

3/2/2009 11:56:00 AM

0

They fixed it :)
R