From: jy5kisok@... Date: 2016-06-10T01:58:57+00:00 Subject: [ruby-dev:49656] [Ruby trunk Bug#12478] ruby2.2.5でオブジェクトに対して def_delegatorを行うとNoMethodError undefined method `method_defined?' が発生する。 Issue #12478 has been reported by keiichi ishioka. ---------------------------------------- Bug #12478: ruby2.2.5でオブジェクトに対して def_delegatorを行うとNoMethodError undefined method `method_defined?' が発生する。 https://bugs.ruby-lang.org/issues/12478 * Author: keiichi ishioka * Status: Open * Priority: Normal * Assignee: * ruby -v: 2.2.5 * Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN ---------------------------------------- - 再現コード > printer = String.new > printer.extend SingleForwardable > printer.def_delegator "STDOUT", :puts NoMethodError: undefined method `method_defined?' for "":String - 原因 - def_single_delegatorで "method_defined?"を行っていますが、 - Moduleクラスをmix-inしていないオブジェクトの場合NoMethodErrorになる。 - 回避方法案 - Moduleが該当オブジェクトのclassに属していない場合,該当処理をスキップする --- /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) -- https://bugs.ruby-lang.org/