[#46329] [ruby-trunk - Feature #7252][Assigned] version number of 2.0 release — "usa (Usaku NAKAMURA)" <usa@...>

26 messages 2012/11/01

[#46350] RubySpecメンテナ — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

15 messages 2012/11/02
[#46352] Re: RubySpecメンテナ — Urabe Shyouhei <shyouhei@...> 2012/11/02

On 11/01/2012 07:43 PM, Yukihiro Matsumoto wrote:

[#46414] [ruby-trunk - Bug #7287][Open] please rename atomic.h which conflicts with /usr/include/atomic.h in Solaris10 — "ngoto (Naohisa Goto)" <ngotogenome@...>

10 messages 2012/11/06

[#46434] トラップハンドラで許されない操作はなにか — KOSAKI Motohiro <kosaki.motohiro@...>

GyRCPi46aiRHJDkbKEIKCltCdWcgIzcxMzRdIBskQiRyRDQkWSRGJCQkRj88SiUkSjtFTU1MZEJq

9 messages 2012/11/06

[#46440] [ruby-trunk - Bug #7300][Open] Hash#[] の挙動が 1.9.3 と異なっている — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

12 messages 2012/11/07

[#46477] Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...>

refinement を導入するときの性能に対する excuse が「method cache に殆どあ

20 messages 2012/11/11
[#46480] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/11

前田です。

[#46488] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

 ささだです.

[#46491] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46493] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

 ささだです.

[#46495] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46497] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — SASADA Koichi <ko1@...> 2012/11/12

(2012/11/12 18:20), Shugo Maeda wrote:

[#46501] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Shugo Maeda <shugo@...> 2012/11/12

前田です。

[#46513] Re: Fwd: [ruby-changes:25559] shugo:r37616 (trunk): * vm_core.h (rb_call_info_t::refinements), compile.c (new_callinfo): — Nobuyoshi Nakada <nobu@...> 2012/11/14

なかだです。

[#46509] [ruby-trunk - Bug #7344][Open] gem pristine bigdecimal が失敗してしまう — "hsbt (Hiroshi SHIBATA)" <shibata.hiroshi@...>

31 messages 2012/11/13

[#46520] [ruby-trunk - Bug #7356][Open] ruby-2.0.0-preview1 で adlint-2.6.10 が性能劣化 — "yanoh (Yutaka Yanoh)" <yutaka@...>

11 messages 2012/11/15

[#46647] [ruby-trunk - Bug #7452][Assigned] Main thread is stopped after running finalizers if the main thread has a finalizer — "mrkn (Kenta Murata)" <muraken@...>

8 messages 2012/11/28

[ruby-dev:46351] [ruby-trunk - Bug #7262] module extension (#include/#prepend) in refinements

From: "shugo (Shugo Maeda)" <redmine@...>
Date: 2012-11-02 03:04:27 UTC
List: ruby-dev #46351
Issue #7262 has been updated by shugo (Shugo Maeda).


matz (Yukihiro Matsumoto) wrote:
> refinementの中でモジュールのincludeやprependがしたい(かつ、そのスコープの範囲内だけで有効にしたい)なんて思ったんですが、きっと困難ですよね。
> 「無理」と思ったら遠慮なくrejectしてください。
> 
>   module Experiment
>     refine String do
>       include Enumerable
>       def foo; p :foo; end
>     end
>   end
> 
>   using Experiment
>   "foo".foo
>   "foo".each(&:p)

# 以下では"refinement"はrefineのブロック中のselfになる匿名モジュールを指します。

Enumerableにはeachは定義されていないので、以下のようにしたいということでしょうか。

module Experiment
  refine String do
    include Enumerable
    def foo; p :foo; end
    def each; each_line; end
  end
end

using Experiment
"foo".foo
p "foo\nbar".map { |i| i.upcase }

実はinclude自体は使えるのですが、上のコードは今の仕様ではエラーになります。

$ ruby /tmp/t.rb
:foo
/tmp/t.rb:11:in `map': undefined method `each' for "foo\nbar":String (NoMethodError)
	from /tmp/t.rb:11:in `<main>'

Enumerableのmap自体はrefinementが有効なスコープで呼べるのですが、
mapの中でeachを呼ぶ時にEnumerable#mapの中ではrefinementが有効で
ないためeachが見つかりません。

まとめると、refinementに対してモジュールをincludeすることはできるが、
そのモジュールでTemplate Methodパターンを使用している場合、テンプレート
メソッドがrefinementで定義されていてもincludeしたモジュールからは呼び
出すことができません。

これを許すようにしようと思うと、local rebindingが必要になってしまうと
思いますが、どうでしょうか。

----------------------------------------
Bug #7262: module extension (#include/#prepend) in refinements
https://bugs.ruby-lang.org/issues/7262#change-32204

Author: matz (Yukihiro Matsumoto)
Status: Open
Priority: Normal
Assignee: shugo (Shugo Maeda)
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-11-01 trunk 37415) [i486-linux]


refinementの中でモジュールのincludeやprependがしたい(かつ、そのスコープの範囲内だけで有効にしたい)なんて思ったんですが、きっと困難ですよね。
「無理」と思ったら遠慮なくrejectしてください。

  module Experiment
    refine String do
      include Enumerable
      def foo; p :foo; end
    end
  end

  using Experiment
  "foo".foo
  "foo".each(&:p)

Matz.



-- 
http://bugs.ruby-lang.org/

In This Thread