[#46309] [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "usa (Usaku NAKAMURA)" <usa@...>

13 messages 2012/10/29
[#46310] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — Tanaka Akira <akr@...> 2012/10/29

2012年10月29日 10:31 usa (Usaku NAKAMURA) <usa@garbagecollect.jp>:

[#46366] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — "U.Nakamura" <usa@...> 2012/11/02

こんにちは、なかむら(う)です。

[#46375] Re: [ruby-trunk - Bug #2154][Assigned] filesystem encoding of UNIX — KOSAKI Motohiro <kosaki.motohiro@...> 2012/11/02

>> とくに指定しなければ、default external は locale から設定されるので、

[ruby-dev:46210] Module#refinements

From: Shugo Maeda <shugo@...>
Date: 2012-10-09 01:55:26 UTC
List: ruby-dev #46210
まつもとさん

前田です。

trunkにModule#refinementsというメソッドを追加したのですが、ささださんから
入れない方がよいのではないかという指摘があったので相談させてください。

これは、レシーバのモジュールにrefineで定義されたrefinementを、キーをrefine対象のクラス、
値をrefineする匿名モジュール(refineのブロック中のself)とするハッシュで返すメソッドです。

例えば、

class C1; end
class C2; end

module M
  refine C1 do
    $c1_ext = self
  end

  refine C2 do
    $c2_ext = self
  end
end

M.refinements #=> {C1 => $c1_ext, C2 => $c2_ext}

のような動作をするものです。

導入の理由の一つは、上記の$c1_extなどは匿名モジュールなのでアクセスしにくいため
リフレクションAPIがあった方が便利ではないかということです。

もう一つの理由は、以下のようにprependと組み合わせると、refinementsをグローバルに
有効にできるということです(そのためにリフレクションAPIがほしいということなので
結局同じ理由ですが)。

M.refinements.each do |klass, refinement|
  klass.send(:prepend, refinement)
end

mathnをrefinementsで置き換えようとした時に、グローバルに有効にする方法がほしいと
むらけんさんに言われたことがきっかけです。
# prependしたモジュールはもとのクラスよりもメソッド探索時に優先されるので、まさに
# グローバルなrefinementのようなものだと思っています。

ささださんからは、実装に依存した機能なので、将来実装方法が変わったら困るのではないか
という指摘があったのですが、そもそもrefineのブロックで匿名モジュールをRubyレベルに
公開してしまっていますし、using Mでrefinementsを有効にできるためにはそれらの匿名
モジュールをMから辿れないといけないので、Module#refinementsを実装できなくなると
いうのは根本的に今の仕様とは別のものになるということだと考えています。

もちろん、そもそも今のrefinementsの仕様がどうなのかという話はあるでしょうし、今は
refinements自体がexperimentalという扱いなので、結局全部無かったことにする可能性も
あると思います。

-- 
Shugo Maeda

In This Thread

Prev Next