Project

General

Profile

Bug #12478

Updated by nobu (Nobuyoshi Nakada) almost 4 years ago

- 再現コード 

     ```ruby 
     

         > printer = String.new 
     
         > printer.extend SingleForwardable 
                                                 
         > printer.def_delegator "STDOUT", :puts 
     #                           
          NoMethodError: undefined method `method_defined?' for "":String 
     ``` 

 - 原因 
  - `def_single_delegator`で "`method_defined?`"を行っていますが、 def_single_delegatorで "method_defined?"を行っていますが、 
  - Moduleクラスをmix-inしていないオブジェクトの場合NoMethodErrorになる。 

 - 回避方法案 
   
  - Moduleが該当オブジェクトのclassに属していない場合,該当処理をスキップする 

         ```diff 
         

               --- /usr/local/.rbenv/versions/2.2.5/lib/ruby/2.2.0/forwardable.rb.org    2016-06-10 10:31:09.613979605 +0900 
         
               +++ /usr/local/.rbenv/versions/2.2.5/lib/ruby/2.2.0/forwardable.rb        2016-06-10 10:35:06.452506085 +0900 
         
               @@ -277,7 +277,7 @@ 
             
                   accessor = accessor.to_s 
             
                   if method_defined?(accessor) || private_method_defined?(accessor) 
               
                     accessor = "#{accessor}()" 
         
               -      end if 
         
               +      end if self.class === Module 
      
             
              
                   line_no = __LINE__; str = %{ 
               
                     def #{ali}(*args, &block) 
         ``` 

Back