From: "naruse (Yui NARUSE)" Date: 2013-08-09T01:40:55+09:00 Subject: [ruby-core:56458] [ruby-trunk - Bug #8722] Refinements remain active beyond the end of an evaled string Issue #8722 has been updated by naruse (Yui NARUSE). shugo (Shugo Maeda) wrote: > naruse (Yui NARUSE) wrote: > > > ���������������������NEWS��������������������������������������������������������� > > > > > > Matz. > > > > ������������������������������������������������NEWS������������������������������������������������ > > ��������������������������������������� > # ������������jruby 1.6.7���������������������trunk������������������������������ > > private/public/protected��������������������������� > > c = Class.new { > eval "private" > def foo > end > } > c.new.foo > > ������������������������������������������������������������? ��������������� rubyspec ������������������������������������������ ---------------------------------------- Bug #8722: Refinements remain active beyond the end of an evaled string https://bugs.ruby-lang.org/issues/8722#change-40999 Author: charliesome (Charlie Somerville) Status: Closed Priority: Normal Assignee: shugo (Shugo Maeda) Category: Target version: ruby -v: ruby 2.1.0dev (2013-08-02 trunk 42320) [x86_64-darwin12.4.0] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN =begin The [[RefinementsSpec]] states: "When main.using is invoked in a string given as the first argument of Kernel#eval, Kernel#instance_eval, or Module#module_eval, the end of the scope is the end of the string." However, in this example script, String#upcase remains refined even after the call to eval() has finished: module M refine String do def upcase reverse end end end puts "hello world".upcase puts eval(%{using M; "hello world".upcase}) puts "hello world".upcase I would expect the output of this script to be: HELLO WORLD dlrow olleh HELLO WORLD Instead it is: HELLO WORLD dlrow olleh dlrow olleh =end -- http://bugs.ruby-lang.org/