けいじゅ@日本ラショナルソフトウェアです.

In [ruby-list:35601] the message: "[ruby-list:35601] Re:
Rational#to_int ← String#center", on Jul/21 23:15(JST) Yukihiro
Matsumoto writes:

>まつもと ゆきひろです

>| こういった、どこにでもありそうなスクリプトの動作が、ライブラリの読み込
>|みで動作がかわるのは、ライブラリ側の問題だと思います。

えー. mathnは振る舞いを変えるのが目的ですので, それをなくすわけにはい
かないです. 使う側が使うことによって何が嬉しくて, 何を気をつけて使わな
くてはならないかを認知して使うものだと思います.

ただ,

>mathnが問題がないとは申しません。が、しかし、

問題があるのは認めています. 今のままでは振る舞いを戻すことができません
ので.

>むしろ、mathnでも意味の変化しない「整除」の演算子(or メソッ
>ド)を明示的に用意するのが良いんだろうなと思います。

うーん. それでは問題は解決しないんですよね... 自分で, mathnを読み込ん
でその人がプログラムを組むならそのような対応はできると思いますが, ほか
のライブラリがmathnの影響を受けるのはとめることはできません.

で, 今考えているのは, 以前出した[ruby-list:32946]の scope-in-stateを用
いて動的に振る舞いを変えることです.

これを使うとmathnは以下のように使えるようになります.

require "other"

1/2 #=> Rational(1,2)
Mathn::NormalBehavior.scope_in do
  # このブロックの中では通常のRubyの振る舞い
  1/2 #=> 0
  other_obj.message
  Mathn::MathnBehavior.scope_in do
    # このブロックの中では通常のMathnの振る舞い
    1/2 #=> Rational(1,2)
    other_obj.message
  end
end

つまり, スコープを指定したブロック内部ではそれぞれの振る舞いをするよう
になります. 標準の振る舞いでなければいけないところは,

  Mathn::NormalBehavior.scopr_in do
    ...
  end

ないで実行すれば良くなります.

# scope-in-stateのサンプル実用例として作成しようと思っていたのですが,
# 半年もたってしまいました...

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---