[ruby-dev:50005] Re: freeze した String を指す WeakRef を作ろうとすると何かがおかしくなるようです

From: SASADA Koichi <ko1@...>
Date: 2017-03-03 08:09:31 UTC
List: ruby-dev #50005
On 2017/03/03 16:30, Nobuyoshi Nakada wrote:
>> です
> WeakRefはfinalizerを使って実装されていますが、1.9.1からはfrozenなオブ
> ジェクトにはfinalizerを追加・削除できなくなっています。
> 

中田さんと議論してたんですが、そもそも frozen にファイナライザを許しても
いいんじゃね、という話になっています。これは、チケットを作って議論したい
と思います。

今禁止されている理由:

http://blade.nagaokaut.ac.jp/cgi-bin/vframe.rb/ruby/ruby-dev/37964?37935-39341

> 元の問題も気になりますが、frozenなオブジェクトに対してfinalizer
> を付け替えできてしまうことが気になります。
> 実際にはObjectSpaceの操作であることや、finalizerからは元のオ
> ブジェクトそのものの操作ができるわけではないことなどが理由な
> のではないかとは思いますが、付け替えの操作自体はオブジェクト
> の内部フラグを変更しているので(あれ、取り除くとき変更してない
> な)、禁止してもいいのではないかという気もします。

が、内部フラグは、別に外から観測できないので、気にしなくていいのでは、と
いう気もします。

禁止したままのほうがいい理由があれば、教えて下さい。私は、「fstring はそ
もそもきえない(ことが多い)のに、ファイナライザを付けるのは、きっと意図
と違うに違いないから禁止してあげたほうが優しい」というのを思いついたんで
すが、これが正当化されるかはよくわかりません。

-- 
// SASADA Koichi at atdot dot net

In This Thread

Prev Next