Daniel Berger
5/21/2007 8:16:00 AM
ara.t.howard wrote:
>
> On May 17, 2007, at 6:10 PM, Daniel Berger wrote:
>
>> Hi,
>>
>> Is there a way to freeze instance variables in Ruby in order to make
>> them single assignment? I'm just wondering if there's a way to
>> simulate Erlang in this regard as a way to avoid side effects.
>>
>> I don't want to simply not define (or undefine) a setter method
>> because you could still get at the instance variable via
>> instance_variable_set. Redefining instance_variable_set won't work
>> either, because that method is apparently not called when performing
>> direct assignment of instance variables. I tried calling the freeze
>> method on the instance variables directly but that didn't seem to work
>> either.
>>
>> Is it possible?
>>
>> Regards,
>>
>> Dan
>>
>
> cfp:~/src/ruby/ > cat a.rb
> class Class
> def fattr a, &b
> define_method(a){ instance_eval &b }
> end
> end
>
> class C
> fattr(:a){ 40 }
> fattr(:b){ a + 2 }
> end
>
> c = C.new
> p c.b
>
>
> cfp:~/src/ruby/ > ruby a.rb
> 42
>
>
> with this approach there is simply no variable to modify - it exists
> only through closure. i know someone could hack in some crazy
> Binding.of_caller thing to munge the closure, but it would be very painful.
>
> kind regards.
Ara, Austin - thanks for the respsonses. Both are interesting approaches.
However, I think I'm going to try digging into the opaque objects behind
the scenes via DL and see if I can't do something more directly. Perhaps
I'll contribute that back to evil.rb. :)
Regards,
Dan